将带有空字符的字符串写入程序的标准输入
Write string with null characters to stdin of program
我正在尝试为本机消息客户端编写一个 Ruby 包装器,以便我可以打开一个通常通过命令行与 Chrome 中的网站交互的外部程序。本机消息协议是 JSON 编码(UTF-8)的消息,其前面是消息长度的 32 位整数,全部为二进制。 Native Message 客户端然后通过 stdin 获取此消息,并通过 stdout 返回以相同方式编码的消息。
我试过的是:
message = '{"message":"version"}'
input = [message.length, message].pack('LA*')
output = `./myNaClProgram #{input}`
puts output
问题是,当我 运行 这样做时,出现以下错误:string contains null byte (ArgumentError)
。这大概是因为当消息最初变成 uint32
时有一些 [=12=]
。
如何将输入字符串传递给本机消息客户端而不 Ruby 抱怨字符串中有空字节?我可以使用不同类型的字符串,或者以不同的方式传递它吗?
这不是 ruby 特有的问题。 nix 系统上的参数作为空终止字符串传递(有关详细信息,请参阅 exec(2)
)。这意味着空字符是任何命令都不能拥有的一种字符参数。您需要考虑一种以不同于通过参数的方式传递包含 null 的消息的方法。 (stdin 可能是最简单的选择)。
我正在尝试为本机消息客户端编写一个 Ruby 包装器,以便我可以打开一个通常通过命令行与 Chrome 中的网站交互的外部程序。本机消息协议是 JSON 编码(UTF-8)的消息,其前面是消息长度的 32 位整数,全部为二进制。 Native Message 客户端然后通过 stdin 获取此消息,并通过 stdout 返回以相同方式编码的消息。
我试过的是:
message = '{"message":"version"}'
input = [message.length, message].pack('LA*')
output = `./myNaClProgram #{input}`
puts output
问题是,当我 运行 这样做时,出现以下错误:string contains null byte (ArgumentError)
。这大概是因为当消息最初变成 uint32
时有一些 [=12=]
。
如何将输入字符串传递给本机消息客户端而不 Ruby 抱怨字符串中有空字节?我可以使用不同类型的字符串,或者以不同的方式传递它吗?
这不是 ruby 特有的问题。 nix 系统上的参数作为空终止字符串传递(有关详细信息,请参阅 exec(2)
)。这意味着空字符是任何命令都不能拥有的一种字符参数。您需要考虑一种以不同于通过参数的方式传递包含 null 的消息的方法。 (stdin 可能是最简单的选择)。