Ruby中struct.pack等价实现?Python转Ruby代码输出不一致排查
Ruby中Python struct.pack('>Q')的等价实现问题解析
其实你的Ruby代码完全没问题,输出看起来不一样只是控制台对不可打印字符的转义显示方式不同,底层的字节内容是完全一致的!
为什么显示看起来有差异?
这是因为Python和Ruby对部分ASCII不可打印字符的转义写法不一样:
- Python里的
\x07(ASCII BEL字符,十进制7),在Ruby里会显示为\a - Python里的
\x1b(ASCII ESC字符,十进制27),在Ruby里会显示为\e
这些只是写法不同,实际对应的字节值是完全相同的。
怎么验证字节内容一致?
你可以把两边的输出转成十六进制格式来确认:
Python验证代码
import struct timestamp = 1523966261 math = timestamp // 30 time_buffer = struct.pack('>Q', math) print(time_buffer.hex()) # 输出: 000000000307211b
Ruby验证代码
timestamp = 1523966261 math = timestamp / 30 time_buffer = [math].pack('Q>') puts time_buffer.unpack('H*').first # 输出: 000000000307211b
可以看到,两者输出的十六进制字符串完全一致,说明字节数据没有问题。
再确认你的Ruby写法是对的
Ruby的pack('Q>')和Python的struct.pack('>Q')是完全等价的:
Q表示8字节无符号长整型>指定大端字节序(网络字节序)
另外,因为你的timestamp是正整数,Ruby里的timestamp / 30和Python的timestamp // 30结果完全相同,计算逻辑也没问题。
所以不用修改你的Ruby代码,它的功能和Python代码是完全一致的,只是显示上的小差异而已。
内容的提问来源于stack exchange,提问作者OmG3r
相关产品推荐
相关产品推荐

