转换三个字节,二进制补码,有符号整数
Convert three bytes, two's complement, signed integer
在SEG-D seismic data format中,一些头参数被格式化为三个字节,二进制补码,有符号二进制。所有值都是大端。
使用String#unpack,Ruby内核只能转换16位和32位值,不能转换24位。
如何通过以下two’s complement方式将二进制值转换为整数:
"\x00\x00\x00" => 0x000000 (0)
"\x00\x00\x01" => 0x000001 (1)
"\x7F\xFF\xFF" => 0x7FFFFF (8388607)
"\xFF\xFF\xFF" => -0x000001 (-1)
"\x80\x00\x00" => -0x800000 (-8388608)
将第一个字节转换为有符号的 8 位(二进制补码),将第二个和第三个字节转换为无符号的 16 位。
# String to be converted (-8388608)
bin = "\x80\x00\x00"
# Convert as signed 8-bit and unsigned 16-bit (big-endian)
values = bin.unpack("c S>")
# Add with the first byte weighted
converted = values[0] * 2**16 + values[1]
最后一行使用按位运算的替代版本shift and OR(可能更有效):
converted = values[0] << 16 | values[1]
在SEG-D seismic data format中,一些头参数被格式化为三个字节,二进制补码,有符号二进制。所有值都是大端。
使用String#unpack,Ruby内核只能转换16位和32位值,不能转换24位。
如何通过以下two’s complement方式将二进制值转换为整数:
"\x00\x00\x00" => 0x000000 (0)
"\x00\x00\x01" => 0x000001 (1)
"\x7F\xFF\xFF" => 0x7FFFFF (8388607)
"\xFF\xFF\xFF" => -0x000001 (-1)
"\x80\x00\x00" => -0x800000 (-8388608)
将第一个字节转换为有符号的 8 位(二进制补码),将第二个和第三个字节转换为无符号的 16 位。
# String to be converted (-8388608)
bin = "\x80\x00\x00"
# Convert as signed 8-bit and unsigned 16-bit (big-endian)
values = bin.unpack("c S>")
# Add with the first byte weighted
converted = values[0] * 2**16 + values[1]
最后一行使用按位运算的替代版本shift and OR(可能更有效):
converted = values[0] << 16 | values[1]