【问题标题】:Failure to read full line including embedded zero bytes未能读取包括嵌入零字节在内的整行
【发布时间】:2014-05-12 22:43:47
【问题描述】:

Lua 脚本:

i=io.read()
print(i)

命令行:

echo -e "sala\x00m" | lua ll.lua

输出:

sala

我希望它打印输入中的所有字符,类似于:

salam

在十六进制编辑器中:

0000000: 7361 6c61 006d 0a                         sala.m.

如何打印输入中的所有字符?

【问题讨论】:

  • 尝试io.read'*a' 而不是io.read()

标签: file-io input lua


【解决方案1】:

你在少数几个 Lua 标准库仍然不是 8 位干净的地方之一绊倒了。
具体来说,逐行读取文件不是embedded-0 proof。

它还没有的原因是不幸的组合:

  • 核心只允许使用标准 C90 或同样可移植的构造,这不提供高效的 0-clean 文本解析。
  • 迄今为止,在该限制下,邮件列表中讨论的每个解决方案都有相当大的开销。
  • 在文本文件中嵌入 0 字节非常少见。

解决方法:

  • 使用修改后的库,修复以下格式:"*l" "*L" for file:read(...)
  • 自己解析原始数据。 (使用数字读取块或尽可能使用"*a")
  • 向 Lua 开发人员/维护人员提出错误修复,直到他们屈服为止。

【讨论】:

  • 我还应该提到 Lua 5.1 的 print() 不能 处理嵌入的 NULL,而 Lua 5.2 的 可以 处理它们。这意味着提问者的代码在 5.1 上将无法工作,即使他没有 *l 缺陷。
  • @NiccoloM。确保一切都是 8 位清洁是一项持续的活动。当时(8 年前)有更多的库函数不是 0 证明的,不仅仅是print。恕我直言file:read 很特别,因为即使它的损坏众所周知,也没有接受任何修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
相关资源
最近更新 更多