我写可与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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top