gpt4 book ai didi

Python:如何制作标准大小为 6 的 struct.calcsize 整数?

转载 作者:行者123 更新时间:2023-11-28 21:49:54 28 4
gpt4 key购买 nike

如果我看这里:https://docs.python.org/2/library/struct.html第 7.3.2.2 节。格式字符,标准大小为 6 的 Python 类型整数没有格式字母。我尝试过“6p”甚至“3H”,但这不起作用,例如:

import struct
struct.calcsize('!6p')

抱歉,如果这听起来很愚蠢...我正在学习如何第一次将字符串转换为打包的二进制数据,用于长度为 6 且值为整数的字符串消息。那么,什么是正确的字母格式才能获得整数的标准大小 6?

更新

我的任务是转换NASDAQ TotalVIEW-ITCH 5.0 specification document, here中包含的二进制消息

例如,如果您查看第 4.1 节:系统事件消息(第 3 页),我会将“S”类型的消息转换如下:

class SystemEventMessage(Message): 
type = 'S'
description = "System Event Message"
message_size = struct.calcsize("!HH6pc") + 1
def __init__(self, message):
(self.locate,self.tracking,self.timestamp, self.code) = struct.unpack("!HH6pc", message[1:])

def pack(self):
return struct.pack("!cHH6pc", self.type,self.locate,self.tracking, self.timestamp, self.code)

我收到这个错误:

struct.error: unpack requires a string argument of length 11

所以我假设我的错误与“6p”有关,因为我找不到任何标准大小为 6 的整数。

更新 2

所以我使用下面的建议使用 6s 而不是 6p,对于文档 第 4.6 节中的以下消息类型“I”:Net Order Imbalance指标 (NOII) 消息,我做:

class NoiiMessage(ITCH41MarketMessage):
type = 'I'
description = "NOII Message"
message_size = struct.calcsize("!HH6sQQc8sIIIcc") + 1

def __init__(self, message):
(self.locate,self.tracking,self.timestamp, self.pairedShares, self.imbalance,
self.imbalanceDirection, self.stock, self.farPrice, self.nearPrice,
self.currentRefPrice, self.crossType, self.priceVariationbsindicator
) = struct.unpack("!HH6sQQc8sIIIcc", message[1:])

def pack(self):
return struct.pack("!cHH6sQQc8sIIIcc", self.type,self.locate,
self.tracking, self.timestamp,
self.pairedShares, self.imbalance,
self.imbalanceDirection, self.stock,
self.farPrice, self.nearPrice,
self.currentRefPrice, self.crossType,
self.priceVariationbsindicator)

我收到这个错误:

struct.error: unpack requires a string argument of length 49

这很奇怪,因为 !HH6sQQc8sIIIcc 的长度是 49...


谢谢大家的帮助!

最佳答案

struct 旨在处理 C 结构。这就是为什么它只有普通的 C 类型。“6 字节整数”不是普通的 C 类型——你不能写类似 struct s { int6 timestamp; } 立即得到一个可用的整数。这就是为什么它在这里也不起作用。

那么,您将如何解决 C 中的问题?你可能会

  • 编写unsigned char ts_data[6];
  • 将值复制到其他地方
  • 填充它并
  • 将结果解释为整数

现在,我们所要做的就是用 Python 表达同样的东西:

>>> struct.pack('q',1324)
',\x05\x00\x00\x00\x00\x00\x00' #my arch is big-endian

>>> struct.unpack('q',',\x05\x00\x00\x00\x00')
error: unpack requires a string argument of length 8

>>> struct.unpack('6s',',\x05\x00\x00\x00\x00')
(',\x05\x00\x00\x00\x00',)

>>> s=_[0]
>>> struct.unpack('q',s+'\x00'*2) #check byte order to find out which side to pad from
(1324,)

关于Python:如何制作标准大小为 6 的 struct.calcsize 整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32801916/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com