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

发布于 2025-01-05 23:47:16 字数 527 浏览 0 评论 0原文

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

malformed number near '0x1F'

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

有谁知道这里可能出了什么问题吗?

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

更新:

tonumber("0xf")

这会返回零,但

tonumber("15")

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

I have a Lua script, where I'm trying to use hex numbers (0x..). If I run this script in the console, with the official Windows binaries, it works fine. But if I run it in my application (simple dofile), I get

malformed number near '0x1F'

It doesn't matter what the hex is, I always get that error, as if it wouldn't support them. The library I'm using is Lua 5.1.4, and I've tried 2 different ones (the first one being one I've compiled myself), so that shouldn't be the problem.

Does anyone have a clue what might be wrong here?

Edit:
It's not the script. No matter what I do, a simple "foo = 0xf" already triggers the error, even if there's nothing else in the file.

Update:

tonumber("0xf")

This returns nil, while

tonumber("15")

work fine. There's definitely something wrong with hex in my libs...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

怪我入戏太深 2025-01-12 23:47:16

如果十六进制文字不适合您(尽管它们应该),您始终可以通过执行 tonumber("fe",16) 使用 lua 中的十六进制

If hex literals aren't working for you (though they should), you can always use hex from lua by doing tonumber("fe",16)

凶凌 2025-01-12 23:47:16

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

好吧,问题是 Lua 默认尝试将数字转换为 double。为此,它使用函数“strtod”,该函数接受 2 个参数:字符串和字符指针。 char 指针应该指向解析后的数字之后的最后一个位置。对于十六进制数来说,这意味着“0”后面的“x”。如果情况并非如此,Lua 会假设发生错误,并给我们这个漂亮的小错误消息。

我使用 DMC 编译了 Lua,因为我需要 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 */

Why do functions have to be different in different compilers, ...why?

Alright, the problem was that Lua tries to convert numbers into double by default. For this it uses the function "strtod", which takes 2 arguments, the string, and a char pointer. The char pointer is supposed to point to the last position after the parsed number. Which for a hex number would mean the 'x', after the '0'. If this isn't the case, Lua assumes an error, and gives us this nice little error message.

I've compiled Lua using DMC, because I need the lib to be in OMF, and I assume others used DMC as well. But apparently DMC's strtod works differenty, since the pointers always point to the start of the string if it's a hex... or rather any invalid number.

I've now added a little hack, which checks for the x, if conversion to double failed. Not pretty, but it works fine for now.

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 */
娇俏 2025-01-12 23:47:16

我在 lua5.2 中遇到了这个错误。 Lua 5.1 运行良好。

I faced this bug with lua5.2. Lua 5.1 works fine.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文