使用hid.dll API从HID设备读取制造商字符串时遇到问题

时间:2010-02-24 21:13:12

标签: .net parsing usb hid

我正在编写一个可以与HID设备通信的.NET应用程序。我希望能够从设备固件中检索和解析Manufactures String。我知道在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)

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

1 个答案:

答案 0 :(得分:1)

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

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

至于缓冲区长度, the documentation for this function表示

  

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

因此缓冲区的大小必须为(126+1) * 2个字节。

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