1

我正在编写一个可以与 HID 设备通信的 .NET 应用程序。我希望能够从设备固件中检索和解析制造商字符串。我知道在 hid.dll 中有一个名为 HidD_GetManufacturerString 的方法。MSDN 对这种方法的描述如下:

 BOOLEAN   HidD_GetManufacturerString(
     IN HANDLE  HidDeviceObject,
     OUT PVOID  Buffer,
     IN ULONG  BufferLength
     );

我用于此方法的包装器看起来像这样......

[DllImport("hid.dll", SetLastError = true)]
        internal static extern Boolean HidD_GetManufacturerString(
            SafeFileHandle hFile,
            Byte[] SerialNumber,
            Int32 SerianNumberLength);

我需要知道两件事。首先,我如何知道将 SerialNumber 缓冲区初始化为什么大小?当我执行 GetFeatureReport 之类的操作时,我知道缓冲区的大小,因为我可以使用 HidD_GetAttributes() 从设备属性中检索最大功能报告长度;不幸的是,这个方法没有给我任何关于制造商字符串、序列号字符串、产品名称字符串等长度的信息。

我的第二个问题是,解析返回为字符串的字节数组的正确方法是什么?我尝试使用

System.Text.Encoding.ASCII.GetString(MfrBuffer)

但我得到了一个奇怪的结果。对于戴尔制造的产品,我的字符串看起来像这样“D\0e\0l\0l\0\0\0\0\0...”,“\0”继续到我传递的缓冲区的末尾。我如何将其解析为“戴尔”?

4

1 回答 1

1

看起来“Dell”作为 unicode 字符串返回(您可以通过每个字符之间的 \0 来判断)。所以你会使用。

System.Text.Encoding.Unicode.GetString(MfrBuffer)

至于缓冲区长度,这个函数的文档

嵌入字符串中的最大可能字符数是特定于设备的。对于 USB 设备,最大字符串长度为 126 个宽字符(不包括终止 NULL 字符)。

所以缓冲区的大小必须是(126+1) * 2字节。

然后您可以使用TrimEnd("\0".ToCharArray())删除额外的尾随 \0s

于 2010-02-24T21:21:44.117 回答