Probleme beim Lesen Hersteller String von HID-Gerät mit hid.dll API
Frage
Ich schreibe eine .NET-Anwendung, die mit HID-Geräten kommunizieren kann. Ich möchte in der Lage sein, abrufen und analysieren die Manufactures String aus der Geräte-Firmware. Ich weiß, dass in der hid.dll es eine Methode HidD_GetManufacturerString genannt wird. MSDN beschreibt diese Methode wie folgt:
BOOLEAN HidD_GetManufacturerString(
IN HANDLE HidDeviceObject,
OUT PVOID Buffer,
IN ULONG BufferLength
);
Der Wrapper i für diese Methode Aussehen bin mit wie dieses ...
[DllImport("hid.dll", SetLastError = true)]
internal static extern Boolean HidD_GetManufacturerString(
SafeFileHandle hFile,
Byte[] SerialNumber,
Int32 SerianNumberLength);
Ich brauche zwei Dinge zu wissen. Erstens: Wie kann ich wissen, was Größe, um den Serial Puffer zu initialisieren? Wenn ich Operationen wie GetFeatureReport Ich weiß, was Größe, um den Puffer zu machen, weil ich die maximale Feature-Bericht Länge aus dem Gerät HidD_GetAttributes Attributen abrufen kann (); Leider ist diese Methode geben Sie mir keine Informationen von der Länge der Hersteller Zeichenfolge, die Seriennummer String, Produktname string, etc.
Die zweite Frage ist, was der richtige Weg ist, um den Byte-Array zu analysieren, die in einen String zurückgegeben wird? Ich habe versucht mit
System.Text.Encoding.ASCII.GetString(MfrBuffer)
, aber ich bekomme ein seltsames Ergebnis. Für ein Produkt manufacturered von Dell meines String sieht wie folgt aus "D \ 0e \ 0l \ 0l \ 0 \ 0 \ 0 \ 0 \ 0 ..." die "\ 0" weiter bis zum Ende des Puffers an, dass ich bestanden. Wie analysiere ich die „Dell“?
Lösung
Es sieht aus wie „Dell“ ist zurück als Unicode-String kommt, (Sie durch das \ 0 zwischen den einzelnen Zeichen sagen kann). so würden Sie verwenden.
System.Text.Encoding.Unicode.GetString(MfrBuffer)
Wie für die Pufferlänge, Die Dokumentation für diese Funktion sagt
Die maximal mögliche Anzahl der Zeichen in einer eingebetteten Zeichenfolge ist gerätespezifisch. Bei USB-Geräten ist die maximale Stringlänge 126 Zeichen breit (nicht die abschließenden NULL-Zeichen einschließlich).
So sind die Puffer Bedürfnisse sein (126+1) * 2
Bytes groß.
Dann können Sie TrimEnd("\0".ToCharArray())
verwenden, um die zusätzlichen hinteren \ 0s