Lua(5.0)相当于python struct.pack

时间:2012-03-17 01:05:10

标签: python lua

我正在尝试将一些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)

4 个答案:

答案 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页面包含的函数提供了一种将整数值打包/解包为二进制字符串的方法。

Example

-- 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约定。