将C函数转换为Lua。

我需要将这个 C 函数转换为 Lua 函数。

我要把一个简单的项目移植到 LuaJIT 上,我的移植已经完成了 99%,但这个函数有些问题。我错过了什么吗?

/**
*  X-Or. 对两个字符串执行按位异或。
*  @param s1:任意二进制字符串。
*  @param s2:与 s1 长度相同的任意二进制字符串。
*  @return 一个与 s1 和 s2 长度相同的二进制字符串,
*   其中每个比特位是 s1-s2 对应比特位的异或值。
*/

static int ex_or (lua_State *L) {
  size_t l1, l2;
  const char *s1 = luaL_checklstring(L, 1, &l1);
  const char *s2 = luaL_checklstring(L, 2, &l2);
  luaL_Buffer b;
  luaL_argcheck( L, l1 == l2, 2, "lengths must be equal" );
  luaL_buffinit(L, &b);
  while (l1--) luaL_putchar(&b, (*s1++)^(*s2++));
  luaL_pushresult(&b);
  return 1;
}

目前,我当前的 Lua 函数是这样的:

local bit = require('bit')
function ex_or(arg1, arg2)
    if #arg1 == #arg2 then
        local result = ""
        local index = 1
        while index <= #arg1 do
            result = result .. bit.bxor(string.byte(arg1, index), string.byte(arg2, index))
            index = index + 1
        end
        return result
    else
        error("lengths must be equal.")
    end
end

提前感谢。

点赞
用户3204551
用户3204551

你忘记在处理过的字节上调用string.char:

result = result .. string.char(bit.bxor(string.byte(arg1, index), string.byte(arg2, index)))

一些额外的提示:

  1. 使用for循环,这样速度会更快。
  2. 使用extern locals用于“bit.bxor”,“string.byte”和“string.char”。
  3. 通常的名称是xor,而不是ex_or(它不再是or了... ;-)).
2014-04-17 23:33:54