【问题标题】:bitwise operators in lua to create stringlua中的按位运算符创建字符串
【发布时间】:2019-11-29 22:48:08
【问题描述】:

LUA 的新用户正在为 Wireshark 创建协议解析器。

参考Lua - Bitwise Logical Operations

我需要 Lua 中的一个函数来根据转换后的十六进制值创建一个字符串:

local function HexToCircuitID(val)
    -- input: 0x9D81
    -- output: "630.1.01"
    local e = ((val >> 4) & 0x3) + 1
    local f = val & 0xF
    local g = val >> 6
    return string.format("%d.%d.%02d",e,f,g)
end

解释器在右移运算符的第一行遇到“'>' 附近的意外符号”问题。

另外,我不确定字符串格式函数是否会像在 C 中一样运行(Lua 的新手)。这个函数是创建一个ProtoField,显示为:

CircuitId: 630.1.01

该字段的实际值为 0x9D81。

【问题讨论】:

  • 你检查lua版本了吗?您链接的那个问题的答案解释了 5.2 和更早的 lua 版本没有位运算符,只是一个库。

标签: lua bit-manipulation wireshark-dissector


【解决方案1】:

您可以使用bit.rshift(x, n) 进行右移,使用bit.band(x1[,x2...]) 进行&。

然后函数变成:

local function HexToCircuitID(val)
    -- input: 0x9D81
    -- output: "630.1.01"
    local e = bit.band(bit.rshift(val, 4), 0x3) + 1
    local f = bit.band(val, 0xF)
    local g = bit.rshift(val, 6)

    --return string.format("%d.%d.%02d",e,f,g)
    return string.format("%d.%d.%02d",g,f,e)
end

为了获得正确的顺序,我必须将 e,f,g 更改为 g,f,e。

这将适用于使用 Lua 5.2 的最新版本的 Wireshark。正如 Nifim 所提到的,您必须使用位库而不是位运算符,因为它们是在 Lua 5.3 中引入的。

【讨论】:

猜你喜欢
  • 2014-04-08
  • 2019-04-21
  • 2011-07-29
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
相关资源
最近更新 更多