我正在编写一个可以与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”继续到我传递的缓冲区的末尾。我如何解析这个“戴尔”?
答案 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