getStringDescriptor: Fix support for null chars in utf16 encoding.
Keep getASCIIStringDescriptor in sync.
diff --git a/usb1/__init__.py b/usb1/__init__.py
index b39f59d..0e3c035 100644
--- a/usb1/__init__.py
+++ b/usb1/__init__.py
@@ -131,6 +131,7 @@
):
if value < 0:
__raiseUSBError(value)
+ return value
try:
namedtuple = collections.namedtuple
@@ -1309,17 +1310,18 @@
Return value is a unicode string.
Return None if there is no such descriptor on device.
"""
- descriptor_string, _ = create_binary_buffer(STRING_LENGTH)
+ descriptor_string = bytearray(STRING_LENGTH)
try:
- mayRaiseUSBError(libusb1.libusb_get_string_descriptor(
- self.__handle, descriptor, lang_id, descriptor_string,
- sizeof(descriptor_string),
+ received = mayRaiseUSBError(libusb1.libusb_get_string_descriptor(
+ self.__handle, descriptor, lang_id,
+ create_binary_buffer(descriptor_string)[0],
+ STRING_LENGTH,
))
# pylint: disable=undefined-variable
except USBErrorNotFound:
# pylint: enable=undefined-variable
return None
- return descriptor_string.value.decode('UTF-16-LE', errors=errors)
+ return descriptor_string[:received].decode('UTF-16-LE', errors=errors)
def getASCIIStringDescriptor(self, descriptor, errors='strict'):
"""
@@ -1328,17 +1330,18 @@
Return value is a unicode string.
Return None if there is no such descriptor on device.
"""
- descriptor_string, _ = create_binary_buffer(STRING_LENGTH)
+ descriptor_string = bytearray(STRING_LENGTH)
try:
- mayRaiseUSBError(libusb1.libusb_get_string_descriptor_ascii(
- self.__handle, descriptor, descriptor_string,
- sizeof(descriptor_string),
+ received = mayRaiseUSBError(libusb1.libusb_get_string_descriptor_ascii(
+ self.__handle, descriptor,
+ create_binary_buffer(descriptor_string)[0],
+ STRING_LENGTH,
))
# pylint: disable=undefined-variable
except USBErrorNotFound:
# pylint: enable=undefined-variable
return None
- return descriptor_string.value.decode('ASCII', errors=errors)
+ return descriptor_string[:received].decode('ASCII', errors=errors)
# Sync I/O