【问题标题】:Write string with null characters to stdin of program将带有空字符的字符串写入程序的标准输入
【发布时间】:2015-04-25 12:28:03
【问题描述】:

我正在尝试为 Native Message 客户端编写一个 Ruby 包装器,以便我可以打开一个通常通过命令行与 Chrome 中的网站交互的外部程序。本机消息协议是 JSON 编码(UTF-8 格式)的消息,前面是消息长度的 32 位整数,全部为二进制。然后,Native Message 客户端通过标准输入接收该消息,并通过标准输出返回以相同方式编码的消息。

我尝试做的是:

message = '{"message":"version"}'
input = [message.length, message].pack('LA*')
output = `./myNaClProgram #{input}`
puts output

问题是当我运行它时,我收到以下错误:string contains null byte (ArgumentError)。这大概是因为当消息最初变成uint32时有一些\0

如何将输入字符串传递给本机消息客户端,而 Ruby 不会抱怨字符串中的空字节?我可以使用不同类型的字符串,或者以不同的方式传递它吗?

【问题讨论】:

  • 试试output = IO.popen(['./myNaClProgram', input]).read
  • 那不行;它给了我同样的错误:popen': string contains null byte (ArgumentError) :-(

标签: ruby google-nativeclient


【解决方案1】:

这不是 ruby​​ 特有的问题。 nix 系统上的参数作为以 null 结尾的字符串传递(有关详细信息,请参阅 exec(2))。这意味着空字符是任何命令都不能具有的一种字符参数。您需要考虑一种以不同于通过参数的方式传递包含 null 的消息的方法。 (stdin 可能是最简单的选择)。

【讨论】:

  • 哦,呃,我试图将它添加为参数而不是通过标准输入(这是它在文档中所说的)。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-03-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多