使用hid.dll API无法读取制造商字符串从HID设备
题
我写可与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)
但我得到一个奇怪的结果。对于戴尔manufacturered产品我的字符串看起来像“d \ 0E \0升\0升\ 0 \ 0 \ 0 \ 0 \ 0 ...”中的“\ 0”继续到缓冲区的末尾,我过去了。如何分析此为“戴尔”?
解决方案
它看起来像“戴尔”是回来为unicode字符串,(你可以通过\ 0每个字符之间告诉)。所以你会使用。
System.Text.Encoding.Unicode.GetString(MfrBuffer)
作为用于缓冲器长度,此函数中的文档说
在嵌入式字符串中的字符的最大可能数量是特定于设备的。对于USB设备,最大字符串长度为126个宽字符(不包括终止NULL字符)。
因此,缓冲器需要是(126+1) * 2
字节的大小。
然后可以使用TrimEnd("\0".ToCharArray())
删除多余的尾随\ 0
不隶属于 StackOverflow