十六进制常量=格式错误的数字?

我有一个 Lua 脚本,我想在其中使用十六进制数字(0x..)。如果我在控制台中使用官方 Windows 二进制文件运行此脚本,则可以正常工作。但是,如果我在我的应用程序中运行它(只是简单的 dofile),我会得到

malformed number near '0x1F'

无论十六进制是什么,我始终都会得到这个错误,就好像它不支持它们一样。我使用的库是 Lua 5.1.4,我尝试过两个不同的库(第一个是我自己编译的),所以那不应该是问题。

有人知道这里可能有什么问题吗?

编辑: 不是剧本的问题。无论我做什么,一个简单的“foo = 0xf”已经触发了这个错误,即使文件中没有其他内容。

更新:

tonumber("0xf")

这将返回 nil,而

tonumber("15")

正常工作。我的库中的十六进制肯定有问题...

原文链接 https://stackoverflow.com/questions/9310293

点赞
stackoverflow用户282536
stackoverflow用户282536

如果十六进制文字在你的代码中无法正常使用(虽然它们应该有效),你可以使用 Lua 中的十六进制表示法,只需执行 tonumber("fe",16) 即可。

2012-02-16 17:34:51
stackoverflow用户1171898
stackoverflow用户1171898

为什么不同编译器中的函数必须不同呢,…为什么?

好吧,问题在于 Lua 默认尝试将数字转换为双精度数。为此它使用了函数"strtod",它有两个参数,字符串和一个 char 指针。char 指针应该指向解析出的数字之后的最后一个位置。对于十六进制数字来说,这意味着'0'之后的'x'。如果不是这种情况,Lua 就会假定出错,并给我们这个漂亮的小错误消息。

我用 DMC 编译了 Lua,因为我需要 lib 是在 OMF 中的,我想其他人也使用了 DMC。但显然 DMC 的 strtod 的工作方式不同,因为指针始终指向字符串的开头,如果它是十六进制……或者说任何无效的数字。

我现在添加了一个小技巧,如果转换为双精度失败,则检查 x。这不太美观,但现在它运行得很好。

int luaO_str2d (const char *s, lua_Number *result) {
  char *endptr;
  *result = lua_str2number(s, &endptr);

  /* Hack for DMC */
  if (endptr == s)
    if(*(s+1) == 'x' || *(s+1) == 'X')
      endptr++;
    else
      return 0; /* conversion failed */
2012-02-17 09:19:29
stackoverflow用户88888888
stackoverflow用户88888888

我遇到了这个 bug 在使用 lua5.2 上。Lua 5.1 却可以正常运行。

2014-12-25 09:46:43