【发布时间】:2020-08-10 18:03:24
【问题描述】:
我只想使用具有 C# 文档中指定的以下结构的 python 将原始字节数组(未知编码)转换为 Ctype 值。但是输出不正确。我的意思是,LTP 显示为负数,但事实并非如此。如果我缺少某些编码,请指导。
我只想要 LTP 字段,我尝试使用偏移量仍然值不正确。我可以将字节位置直接转换为Ctype值还是有其他方法?
结构
字节位置:1-2 类型:int8 字段:交换
字节位置:2-6 类型:int32 字段:仪器令牌
字节位置:6-10 类型:int32 字段:Ltp
字节位置:10-14 类型:int32 字段:更改
字节位置:14-18 类型:int32 字段:交换时间戳
字节位置:18-22 类型:int32 字段:卷
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
【问题讨论】:
-
缓冲区和结构大小不一致(26 与 22)。你知道原始数据字节应该翻译成什么吗?拥有示例输入和正确的所需输出将有助于解决您的问题。
标签: python arrays python-3.7 ctypes