トラブル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バッファを初期化するためにどのようなサイズを知っていますか?私はHidD_GetAttributes()を使用して、デバイスの属性からの最大の特徴レポートの長さを取得することができますので、私はバッファを作るためにどのようなサイズGetFeatureReport Iのノウハウのような操作を行うと、残念ながら、この方法は私などメーカー文字列、シリアル番号文字列、製品名文字列の長さのいずれかの情報を与えるものではありません。
私の2番目の質問は、文字列に返されたバイト配列を解析するための正しい方法は何ですか?私が使用してみました。
System.Text.Encoding.ASCII.GetString(MfrBuffer)
が、私は奇妙な結果を得ます。 Dellがmanufacturered製品のように私の文字列に見えるこの「D \ 0E \ 0リットル\ 0リットル\ 0 \ 0 \ 0 \ 0 \ 0 ...」「\ 0」は、私が通過したことをバッファの最後に進みます。私は、「デル」にこれを解析する方法を教えてください。
解決
それは、「Dellは」バックUnicode文字列として来ているように、(あなたはそれぞれの文字の間\ 0で伝えることができます)になります。あなたが使用します。
System.Text.Encoding.Unicode.GetString(MfrBuffer)
この関数ののバッファ長としては、ドキュメント
と言います埋め込まれた文字列内の文字の最大数は、デバイス固有のものです。 USBデバイスの場合、文字列の最大長は、(終端NULL文字を含まない)126個のワイド文字である。
は、バッファの必要があることがので(126+1) * 2
のサイズがバイト
そして、あなたは余分を削除するためにTrimEnd("\0".ToCharArray())
を使用することができ、末尾\ 0