Cyb*_*ent 2 python parsing struct python-3.x
有人可以帮助解决以下代码行和错误吗?我不熟悉python值转换。
产生错误的具体行是:
value = struct.unpack("<h",chr(b)+chr(a))[0]
Run Code Online (Sandbox Code Playgroud)
类型错误:需要类似字节的对象,而不是“str”
代码片段是:
if packet_code ==0x80: # raw value
row_length = yield
a = yield
b = yield
value = struct.unpack("<h",chr(b)+chr(a))[0]
Run Code Online (Sandbox Code Playgroud)
输入数据为:
b'\x04\x80\x02\x00\xb2\xcb\xaa\xaa\x04\x80\x02\x00p\r\xaa\xaa\x04\x80\x02\x00] \xaa\xaa\x04\x80\ x02\x00@=\xaa\xaa\x04\x80\x02\x007F\xaa\xaa\x04\x80\x02\x00\!\xaa\xaa\x04\x80\x02\x00=@\xaa\xaa\ x04\x80\x02\x00=@\xaa\xaa\x04\x80\x02\x00i\x14\xaa\xaa\x04\x80\x02\x00] \xaa\xaa\x04\x80\x02\x00p\r \xaa\xaa\x04\x80\x02\x00\x80\xfd\xaa\xaa
我正在使用 python 3.5。此代码似乎适用于旧版本。
这是类似解析器代码的链接,它可能与以前版本的 Python 一起使用: 解析器代码链接
这是有关如何从设备 RAW 波形值(16 位)发送数据的说明的链接
该数据值由两个字节组成,代表单个原始波形样本。它的值是一个有符号的 16 位整数,范围从 -32768 到 32767。Value 的第一个字节表示二进制补码值的高位,而第二个字节表示低位。要重建完整的原始波形值,只需将第一个字节左移 8 位,然后与第二个字节按位或:
short raw = (Value[0]<<8) | Value[2];
Run Code Online (Sandbox Code Playgroud)
其中 Value[0] 是高位字节,Value 1是低位字节。
在位操作不方便的系统或语言中,可以用以下算术运算代替:
raw = Value[0]*256 + Value[1];
if( raw >= 32768 ) raw = raw - 65536;
Run Code Online (Sandbox Code Playgroud)
真的很感谢任何帮助,因为我目前陷入困境。
当您使用 Python 2.x 时,它str是一个字节数组。对于 Python 3,您必须bytes像这样使用:
struct.unpack("<h", bytes([b, a]))[0]
Run Code Online (Sandbox Code Playgroud)