Проблема с чтением строки производителя с устройства HID с использованием hid.dll API

StackOverflow https://stackoverflow.com/questions/2329572

  •  22-09-2019
  •  | 
  •  

Вопрос

Я пишу .NET-приложение, которое может взаимодействовать с устройствами HID.Я хочу иметь возможность извлекать и анализировать строку Manufactures из прошивки устройства.Я знаю, что в 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" продолжается до конца буфера, который я передал.Как мне перевести это в "Dell"?

Это было полезно?

Решение

Похоже, что "Dell" возвращается в виде строки в юникоде (вы можете определить это по \ 0 между каждым символом).таким образом, вы бы использовали.

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

Что касается длины буфера, документация для этой функции говорит

Максимально возможное количество символов во встроенной строке зависит от конкретного устройства.Для устройств USB максимальная длина строки составляет 126 широких символов (не включая завершающий нулевой символ).

Таким образом, буфер должен быть (126+1) * 2 размер в байтах.

Тогда вы можете использовать TrimEnd("\0".ToCharArray()) чтобы удалить лишние конечные \ 0s

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top