2010-02-24 104 views
1

我写能与HID设备通信的.NET应用程序从HID设备读取制造商字符串。我希望能够从设备固件中检索并解析制造商字符串。我知道,在hid.dll有一个名为HidD_GetManufacturerString方法。 MSDN描述了这种方法如下:故障使用hid.dll API

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”继续给我传递的缓冲区的末尾。我如何解析“戴尔”?

回答

1

它看起来像“戴尔”是回来为unicode字符串,(你可以通过\ 0每个字符之间告诉)。所以你会用。

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

作为缓冲区的长度, the documentation for this function

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

所以缓冲区需要大小为(126+1) * 2字节。

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

+0

太好了。那么,如何修剪不使用整个126宽字符的设备的所有零点? – PICyourBrain 2010-02-24 21:31:49

+0

貌似这个做到了...... raw.TrimEnd( “\ 0” .ToCharArray()); – PICyourBrain 2010-02-24 21:38:57