我正在尝试将某人的Ruby代码转换为我的Python代码。最初的开发人员不再和我们在一起了,我不认识Ruby。他的大多数代码都很容易理解,但是下面的一些语法让我感到很沮丧。
示例:
myTable = ''
myTable << [ 0, 1, 0, 0, 0, 300].pack('vvvvvv')
myTable [40, 4] = [41310005 - 5].pack('V')
1)我是否正确地假设在第二行之后,myTable将保存[]中指定的6个值的数组?是.pack()
与Python的struct.pack
类似吗?
2)在第三行之后,右边的值是否会存储在数组中的位置40并且是4个字节长? []中的-5只是他有趣还是有特殊意义?
答案 0 :(得分:3)
你对第二行的看法是错误的,但奇怪的是你说它与struct.pack
类似。 myTable
是一个字符串。 Array#pack()
返回打包数据的字符串(很像struct.pack
),String#<<
将字符串附加到接收字符串。第三行将索引40处的4个字节设置为[41310000].pack('V')
的结果。
答案 1 :(得分:2)
查看Array#pack
的文档。它将数组转换为二进制序列的字符串表示形式。 v
是“Short,little-endian字节顺序”的指令,V
是“Long,little-endian字节顺序”。
<<
在发送到String
对象时充当连接。但是,由于字符串在该点之前是空的,myTable
可能已立即初始化为[0, 1, 0, 0, 0, 300].pack('vvvvvv')
。
String#[m,n]=
将索引m
中的子字符串替换为m+n
。
答案 2 :(得分:1)
不,myTable是一个字符串(它被分配了一个字符串文字)。 &lt;&lt;&lt;字符串(和数组)上的运算符是追加运算符,因此您将字符串附加到字符串。 pack方法返回一个字符串,在本例中是一个字符串“Short,little-endian byte order”。它将是一个由6个短整数组成的字符串,不会以任何方式转换为ASCII,只是转换为字符串。
然后,这个原生格式的整数字符串的一部分被pack中的另一个值替换,这一回合返回一个“Long,little-endian字节顺序”。它被替换为字符串中40个字节的位置,长度为4个字节。
这是一些非常时髦的代码。只要知道myTable是一个字符串,那个包就会以原生格式返回数字。