@@ -30,23 +30,23 @@ def get_serial_number_string
3030 end
3131
3232 def read ( length )
33- buffer = FFI :: Buffer . new ( 1 , length , true )
33+ buffer = clear_buffer length
3434 with_hid_error_handling do
3535 HidApi . hid_read self , buffer , buffer . length
3636 end
3737 buffer
3838 end
3939
4040 def read_timeout ( length , timeout )
41- buffer = FFI :: Buffer . new ( 1 , length , true )
41+ buffer = clear_buffer length
4242 with_hid_error_handling do
4343 HidApi . hid_read_timeout self , buffer , buffer . length , timeout
4444 end
4545 buffer
4646 end
4747
4848 def write ( data )
49- buffer = FFI :: Buffer . new ( 1 , data . length , true )
49+ buffer = clear_buffer data . length
5050 case data
5151 when String then buffer . put_bytes 0 , data
5252 when Array then buffer . put_array_of_char 0 , data
@@ -72,8 +72,15 @@ def error
7272 end
7373
7474 private
75+ def clear_buffer length
76+ b = FFI ::Buffer . new ( 1 , length )
77+ # FFI::Buffer doesn't clear the first byte if length < 8
78+ b . put_char 0 , 0
79+ b
80+ end
81+
7582 def get_buffered_string field
76- buffer = FFI :: Buffer . new ( 1 , 255 , true )
83+ buffer = clear_buffer 255
7784 HidApi . send "hid_get_#{ field } _string" , self , buffer , buffer . length
7885 buffer . read_wchar_string
7986 end
0 commit comments