将字节数组转换为 Ctype 结构值
Convert byte array to Ctype struct values
我只想使用 python 将原始字节数组(未知编码)转换为 Ctype 值,并具有 C# 文档中指定的以下结构。但是输出不正确。我的意思是,LTP 显示为负数,但事实并非如此。如果我缺少一些编码,请指导。
我只想要 LTP 字段,我试过使用偏移量,但值仍然不正确。我可以直接将bytposition转换为Ctype值还是有其他方法?
结构
字节位置:1-2 Type:int8 Field:Exchange
字节位置:2-6 Type:int32 Field:Instrument 令牌
字节位置:6-10 Type:int32 Field:Ltp
字节位置:10-14 Type:int32 Field:Change
字节位置:14-18 Type:int32 Field:Exchange 时间戳
字节位置:18-22 Type:int32 Field:Volume
from ctypes import Structure,c_int32, c_byte
class CompactMarketData(Structure):
_fields_ = [("Mode", c_byte),("Exchange", c_byte),("InstrumentToken", c_int32), ("LastTradedPrice", c_int32), ("Change", c_int32), ("ExchangeTimeStamp", c_int32), ("Volume", c_int32)]
def main():
raw=b'\x02\x06\x00\x08;8\x00\x01n\x04\xff\xff\xff\x06_0\xc5\xea\x00\x00",_0\xc5\xea'
b = bytearray(raw)
s = CompactMarketData.from_buffer(b)
print("Mode: "+format(s.Mode))
print("Exchange: "+format(s.Exchange))
print("InstrumentToken: "+format(s.InstrumentToken))
print("LastTradedPrice: ",str(s.LastTradedPrice))
print("Change: "+format(s.Change))
print("ExchangeTimeStamp: "+format(s.ExchangeTimeStamp))
print("Volume: "+format(s.Volume))
if __name__ == '__main__':
main()
输出:
交流:2
仪器代币:16791611
最后交易价格:-64402
更改:811534079
交换时间戳:60101
成交量:811543586
使用_pack_ = 1
(documentation)结构属性满足条件:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from ctypes import Structure, c_int32, c_byte
class CompactMarketData(Structure):
_pack_ = 1
_fields_ = [
("Mode", c_byte),
("Exchange", c_byte),
("InstrumentToken", c_int32),
("LastTradedPrice", c_int32),
("Change", c_int32),
("ExchangeTimeStamp", c_int32),
("Volume", c_int32)
]
def view_offsets(self):
for field in self._fields_:
name, field_type = field
field_start = getattr(self.__class__, name).offset
field_end = field_start + ctypes.sizeof(field_type)
print(f"{name} - {field_start}:{field_end}")
def main():
raw=b'\x02\x06\x00\x08;8\x00\x01n\x04\xff\xff\xff\x06_0\xc5\xea\x00\x00",_0\xc5\xea'
b = bytearray(raw)
s = CompactMarketData.from_buffer(b)
s.view_offsets()
print(f"\n{'-' * 79}")
print(f"Struct Size: {ctypes.sizeof(CompactMarketData)}")
print(f"buffer len: {len(raw)}")
print(f"Mode: {s.Mode:#x}")
print(f"Exchange: {s.Exchange:#x}")
print(f"InstrumentToken: {s.InstrumentToken:#x}")
print(f"LastTradedPrice: {s.LastTradedPrice:#x}")
print(f"Change: {s.Change:#x}")
print(f"ExchangeTimeStamp: {s.ExchangeTimeStamp:#x}")
print(f"Volume: {s.Volume:#x}")
if __name__ == "__main__":
main()
输出:
Mode - 0:1
Exchange - 1:2
InstrumentToken - 2:6
LastTradedPrice - 6:10
Change - 10:14
ExchangeTimeStamp - 14:18
Volume - 18:22
-------------------------------------------------------------------------------
Struct Size: 22
buffer len: 26
Mode: 0x2
Exchange: 0x6
InstrumentToken: 0x383b0800
LastTradedPrice: 0x46e0100
Change: 0x6ffffff
ExchangeTimeStamp: -0x153acfa1
Volume: 0x2c220000
注意:请注意您的字节缓冲区长于结构的大小。
我只想使用 python 将原始字节数组(未知编码)转换为 Ctype 值,并具有 C# 文档中指定的以下结构。但是输出不正确。我的意思是,LTP 显示为负数,但事实并非如此。如果我缺少一些编码,请指导。
我只想要 LTP 字段,我试过使用偏移量,但值仍然不正确。我可以直接将bytposition转换为Ctype值还是有其他方法?
结构
字节位置:1-2 Type:int8 Field:Exchange
字节位置:2-6 Type:int32 Field:Instrument 令牌
字节位置:6-10 Type:int32 Field:Ltp
字节位置:10-14 Type:int32 Field:Change
字节位置:14-18 Type:int32 Field:Exchange 时间戳
字节位置:18-22 Type:int32 Field:Volume
from ctypes import Structure,c_int32, c_byte
class CompactMarketData(Structure):
_fields_ = [("Mode", c_byte),("Exchange", c_byte),("InstrumentToken", c_int32), ("LastTradedPrice", c_int32), ("Change", c_int32), ("ExchangeTimeStamp", c_int32), ("Volume", c_int32)]
def main():
raw=b'\x02\x06\x00\x08;8\x00\x01n\x04\xff\xff\xff\x06_0\xc5\xea\x00\x00",_0\xc5\xea'
b = bytearray(raw)
s = CompactMarketData.from_buffer(b)
print("Mode: "+format(s.Mode))
print("Exchange: "+format(s.Exchange))
print("InstrumentToken: "+format(s.InstrumentToken))
print("LastTradedPrice: ",str(s.LastTradedPrice))
print("Change: "+format(s.Change))
print("ExchangeTimeStamp: "+format(s.ExchangeTimeStamp))
print("Volume: "+format(s.Volume))
if __name__ == '__main__':
main()
输出:
交流:2
仪器代币:16791611
最后交易价格:-64402
更改:811534079
交换时间戳:60101
成交量:811543586
使用_pack_ = 1
(documentation)结构属性满足条件:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from ctypes import Structure, c_int32, c_byte
class CompactMarketData(Structure):
_pack_ = 1
_fields_ = [
("Mode", c_byte),
("Exchange", c_byte),
("InstrumentToken", c_int32),
("LastTradedPrice", c_int32),
("Change", c_int32),
("ExchangeTimeStamp", c_int32),
("Volume", c_int32)
]
def view_offsets(self):
for field in self._fields_:
name, field_type = field
field_start = getattr(self.__class__, name).offset
field_end = field_start + ctypes.sizeof(field_type)
print(f"{name} - {field_start}:{field_end}")
def main():
raw=b'\x02\x06\x00\x08;8\x00\x01n\x04\xff\xff\xff\x06_0\xc5\xea\x00\x00",_0\xc5\xea'
b = bytearray(raw)
s = CompactMarketData.from_buffer(b)
s.view_offsets()
print(f"\n{'-' * 79}")
print(f"Struct Size: {ctypes.sizeof(CompactMarketData)}")
print(f"buffer len: {len(raw)}")
print(f"Mode: {s.Mode:#x}")
print(f"Exchange: {s.Exchange:#x}")
print(f"InstrumentToken: {s.InstrumentToken:#x}")
print(f"LastTradedPrice: {s.LastTradedPrice:#x}")
print(f"Change: {s.Change:#x}")
print(f"ExchangeTimeStamp: {s.ExchangeTimeStamp:#x}")
print(f"Volume: {s.Volume:#x}")
if __name__ == "__main__":
main()
输出:
Mode - 0:1
Exchange - 1:2
InstrumentToken - 2:6
LastTradedPrice - 6:10
Change - 10:14
ExchangeTimeStamp - 14:18
Volume - 18:22
-------------------------------------------------------------------------------
Struct Size: 22
buffer len: 26
Mode: 0x2
Exchange: 0x6
InstrumentToken: 0x383b0800
LastTradedPrice: 0x46e0100
Change: 0x6ffffff
ExchangeTimeStamp: -0x153acfa1
Volume: 0x2c220000
注意:请注意您的字节缓冲区长于结构的大小。