我正在尝试将一些python代码转换为Lua。什么是Lua相当于:
value2 = ''
key = 'cmpg'
value1 = '\x00\x00\x00\x00\x00\x00\x00\x01'
Value2 += '%s%s%s' % (key, struct.pack('>i', len(value1)), value1)
答案 0 :(得分:3)
如何将struct.pack
用于Lua(它基于string.pack
的代码)?它提供了您期望的相同功能。因此,您可以运行以下代码:
local key = 'cmpg'
local value1 = '\0\0\0\0\0\1'
local packed = key .. struct.pack('>i', #value1) .. value1
或者,查看文档中的示例,您也可以这样做:
local packed = key .. struct.pack('>ic0', #value1, value1)
要解压缩此类字符串,请使用以下内容(假设<length,string>
中只有data
):
local unpacked = struct.unpack('>ic0', data)
答案 1 :(得分:1)
看看string.pack;您可以找到Lua for Windows附带的Windows预编译二进制文件。
value2 = ''
key = 'cmpg'
value1 = '\x00\x00\x00\x00\x00\x00\x00\x01'
value2 = string.format("%s%s%s", key, string.pack(">i", #value1, value))
如果您正在使用LuaJIT(我强烈推荐),您可以使用FFI并将原始值转换为字节数组并使用memcpy。
答案 2 :(得分:1)
Read Write Format wiki页面包含的函数提供了一种将整数值打包/解包为二进制字符串的方法。
-- Write an integer in MSB order using width bytes.
function numbertobytes(num, width)
local function _n2b(t, width, num, rem)
if width == 0 then return table.concat(t) end
table.insert(t, 1, string.char(rem * 256))
return _n2b(t, width-1, math.modf(num/256))
end
return _n2b({}, width, math.modf(num/256))
end
io.write("<", numbertobytes(0x61626364, 4), ">\n")
<abcd>
答案 3 :(得分:-1)
你在评论中说:
我可能知道每个人生成的字符串 以下内容:struct.pack('&gt; i',4),struct.pack('&gt; i',8),以及 struct.pack( '&GT; I',10)
效应器'&gt; i'表示bigendian签名的32位整数。对于非负输入x,简单的Python等价物将是
chr((x >> 24) & 255) + chr((x >> 16) & 255) + chr((x >> 8) & 255) + chr(x & 255)
你应该能够毫不费力地在Lua中表达这一点。
你在另一条评论中说:
我...不理解答案(@john machin)
chr(x)很容易在文档中找到。 Lua应该具有这样的功能,甚至可能具有相同的名称。
i >> n
向右移动n位。如果i是无符号的,则相当于i // ( 2 ** n)
,其中//
是Python的整数分区。
i & 255
是按位的 - 相当于i % 256
。
Lua应该同时拥有这两个。
+
在这种情况下是字符串连接。
看看这个:
>>> import binascii
>>> def pack_be_I(x):
... return (
... chr((x >> 24) & 255) +
... chr((x >> 16) & 255) +
... chr((x >> 8) & 255) +
... chr(x & 255)
... )
...
>>> for anint in (4, 8, 10, 0x01020304, 0x04030201):
... packed = pack_be_I(anint)
... hexbytes = binascii.hexlify(packed)
... print anint, repr(packed), hexbytes
...
4 '\x00\x00\x00\x04' 00000004
8 '\x00\x00\x00\x08' 00000008
10 '\x00\x00\x00\n' 0000000a
16909060 '\x01\x02\x03\x04' 01020304
67305985 '\x04\x03\x02\x01' 04030201
>>>
您会注意到10
所需的输出为'\x00\x00\x00\n'
...请注意'\x0a'
又称'\n'
又称chr(10)
需要谨慎。如果您要将此内容写入Windows上的文件,则必须以二进制模式('wb'
,而不是'w'
)打开该文件,否则运行时库将插入回车符,以符合Windows,MS-DOS,文本文件的CP / M约定。