将带有空字符的字符串写入程序的stdin

时间:2015-04-25 12:28:04

标签: ruby google-nativeclient

我正在尝试为Native Message客户端编写Ruby包装器,以便我可以打开一个外部程序,该程序通常通过命令行与Chrome中的网站连接。 Native Message协议是一个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)。这可能是因为当消息最初变为\0时,有一些uint32

如何在没有Ruby抱怨字符串中的空字节的情况下将输入字符串传递给Native Message客户端?我可以使用不同类型的字符串,或以不同的方式传递它吗?

1 个答案:

答案 0 :(得分:1)

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