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

Python:如何生成标准大小为6的struct.calcsize整数?,python,binary,quantitative-finance,algorithmic-trading,Python,Binary,Quantitative Finance,Algorithmic Trading,如果我看这里:参见第7.3.2.2节。格式字符,标准大小为6的Python类型整数没有格式字母。我试过“6p”甚至“3H”,但在以下情况下不起作用: import struct struct.calcsize('!6p') 抱歉,如果这听起来很愚蠢。。。我正在学习如何将字符串转换为压缩的二进制数据,这是我第一次学习长度为6、整数为值的字符串消息。那么,对于一个整数来说,获得标准大小6的正确字母格式是什么呢 更新 我的任务是转换中包含的二进制消息 例如,如果您查看第4.1节:系统事件消息(第3页

如果我看这里:参见第7.3.2.2节。格式字符,标准大小为6的Python类型整数没有格式字母。我试过“6p”甚至“3H”,但在以下情况下不起作用:

import struct
struct.calcsize('!6p')
抱歉,如果这听起来很愚蠢。。。我正在学习如何将字符串转换为压缩的二进制数据,这是我第一次学习长度为6、整数为值的字符串消息。那么,对于一个整数来说,获得标准大小6的正确字母格式是什么呢

更新

我的任务是转换中包含的二进制消息

例如,如果您查看第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
struct.error: unpack requires a string argument of length 49
所以我假设我的错误和“6p”有关,因为我找不到任何标准大小为6的整数

更新2

因此,我使用以下建议,即使用
6s
而不是
6p
,对于文档第4.6节:净订单不平衡指示器(NOII)消息中的以下消息类型“I”,我确实:

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 11
struct.error: unpack requires a string argument of length 49
这太奇怪了,因为
!HH6sQQc8sIIIcc的长度为49



谢谢大家的帮助

struct
设计用于处理C结构。这就是为什么它只有股票C型。 “6字节整数”不是股票C类型-您不能编写类似于
struct s{int6 timestamp;}
的内容来立即获得可用的整数。这就是为什么它在这里也不起作用

那么,如何用C语言解决这个问题呢?你可能会

  • 写入
    无符号字符ts_数据[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,)

NASDAQ TotalView ITCH 5.0

[S0099123456Q]________________________________ wireline SEQ _____________
 | | |     ||
 | | |     |+---------------[[ Event Code   ]]
 | | |     +----------------[[ Timestamp ns ]]
 | | +----------------------[[ Tracking NUM ]]
 | +------------------------[[ Stock Locate ]]
 +--------------------------[[ Message Type ]]

Name           | Offset | Length | Value   | Notes
---------------|--------|--------|---------|-------------------------------------------------------------
Message Type   | 0      | 1      | “S”     | System Event Message.
Stock Locate   | 1      | 2      | Integer | == 0 Always
Tracking Number| 3      | 2      | Integer | NASDAQ OMX internal tracking number
Timestamp      | 5      | 6      | Integer | Nanoseconds since midnight.
Event Code     |11      | 1      | Alpha   | == { 0 | S | Q | M | E | C } See System Event Codes below.
为了获得纳斯达克的时间戳,
使用掩码中的
6B
char[]
<6s

只有在消费者端需要时,才将其后处理为
int()

延迟延迟解除阻塞解除引擎有线传输性能

+还可以欣赏Python 7.3.2.1。关于BigEndian/网络排序一次使用“!”掩码前缀的注意事项


在更新2中添加另一个问题 哪里:
你的问题有点不清楚。要将包含6位数字的字符串转换为二进制整数,还是要将某些内容转换为6位宽的整数?对不起,你能说清楚一点吗?添加您的输入(如)并描述预期的输出将有所帮助。@Delen我更新了我的问题。。。希望这更清楚,我的朋友和我成功地完成了4.1版的挑战。。但是5.0给我带来了大小为6的整数的问题。。。一定很简单,但我不知道!是的,我想你已经找到答案了。如果没有,给我们喊一声。顺便说一句,我刚刚注意到我在第一次评论中犯了一个错误。我的意思是6字节宽,而不是6位(XD)。而且,当格式字符串描述的输入与给定值不匹配时,会引发指定的错误。为了让您感觉更好,我在尝试解压缩24位音频流时遇到了相同的问题。诀窍是填充和切断,并移动位来模拟int32,因为正如您所知,int24在C中没有定义,所以在struct中也没有定义。同样的道理也适用于虚构的int48。作为旁注,请注意所有转换中使用的字节顺序。我没有在示例中指定它,因为它与手头的问题无关。好吧,如果我使用
6s
,我只需要担心将其转换为
int
,如果我想将所有消息以可读格式保存在csv文件中。但是对于6个字符串或6个整数,这很奇怪。。。从午夜开始的纳秒是13位长……是的,这正是最基本的原理——推迟转换(并将其作为特殊的按需任务),以便在有线接口上卸载最紧密的实时循环(总是有大量的一次后处理时间(类似于
.CSV
导出
文件IO
)一周的
DAX
XAUUSD
流日志(引号)需要几十秒(大约一分钟)才能存储在磁盘上,所以转换
hex2int()需要很多很多很多时间
。关于
NASDAQ_时间戳
枚举的异议,请正确检查
NASDAQ TotalView ITCH 5.0第4.0节
中的定义,其中介绍和解释了项目。
NASDAQ_时间戳==<0,2**(6*8)-1>
它涵盖了3.25天以上我想就是这样了…我必须使用
6s
但是我在我的问题中添加了一个新类型的错误,你介意看看它吗?看看可能是什么问题吗?你可能已经知道,这应该作为另一个问题打开,在这里你应该使用http->链接到下一个问题新消息格式的另一个解码掩码-使用通过update1、update2、update3爬行的初始问题…与StackOverflow Netiquette不兼容。
Format  | C-type               | Python-type        | Standard size
========|======================|====================|===============
     x  | pad byte             | no value           |     
     c  | char                 | string of length 1 | 1 
     b  | signed char          | integer            | 1 
     B  | unsigned char        | integer            | 1 
     ?  | _Bool                | bool               | 1 
     h  | short                | integer            | 2 
     H  | unsigned short       | integer            | 2 
     i  | int                  | integer            | 4 
     I  | unsigned int         | integer            | 4 
     l  | long                 | integer            | 4 
     L  | unsigned long        | integer            | 4 
     q  | long long            | integer            | 8 
     Q  | unsigned long long   | integer            | 8 
     f  | float                | float              | 4 
     d  | double               | float              | 8 
     s  | char[]               | string             | 
     p  | char[]               | string             |  
     P  | void *               | integer            |