无法操作字节数组

时间:2009-10-18 05:51:37

标签: ruby-on-rails ruby

我正在尝试将一个字节数组从我的rails应用程序内部传递到另一个ruby脚本(仍在我的rails应用程序中),例如:

`./app/animations/fade.sh "\x01\x01\x04\x00" &`

收益率ArgumentError (string contains null byte)

我想我对如何形成这个字符串感到困惑,而不是把它传递给我的脚本,它将以这种方式使用它:

@sp.write ["#{ARGV[0]}", "f", "\x12"]

如果可能,我想像这样形成字符串(在我的rails应用程序上):

led = "\x01#{led.id}\x04\x00"

但我一直收到ArgumentError (string contains null byte)错误。有没有办法可以从我的rails应用程序中的元素形成这个字符串,然后将它传递给我的外部脚本?

3 个答案:

答案 0 :(得分:1)

您的脚本可以接受来自STDIN的输入吗?也许使用read

如果你不能这样做,你可以编码你的null并转义你的编码 例如。 48656c6c6f0020576f726c64可编码为48656c6c6f200102020576f726c64
如果双方同意2020 = 20和2001 = 00

,则会再次解码

更新我认为编码是您必须要做的,因为我尝试使用read,结果有点太难了。可能还有另一种选择,但我还没有看到它。

这是我的脚本和两个测试运行:

dlamblin$ cat test.sh
echo "reading two lines of input, first line is length of second."
read len
read ans
echo "C string length of second line is:" ${#ans}
for ((c=0; c<$len; c++))
do
    /bin/echo -n "${ans:$c:1},"
done
echo ' '
exit

dlamblin$ echo -e '12\0012Hello \0040World' | sh test.sh
reading two lines of input, first line is length of second.
C string length of second line is: 12
H,e,l,l,o, , ,W,o,r,l,d, 

dlamblin$ echo -e '12\0012Hello \0000World' | sh test.sh
reading two lines of input, first line is length of second.
C string length of second line is: 5
H,e,l,l,o,,,,,,,, 

#Octals \0000 \0012 \0040 are NUL NL and SP respectively

答案 1 :(得分:1)

您可以使用base64传递

周围的字节串
$ cat > test.sh
echo $1 | base64 -d
$ chmod a+x test.sh

然后来自ruby:

irb
>> require 'base64'
=> true
>> `./test.sh "#{Base64.encode64 "\x01\x01\x04\x00"}"`
=> "\x01\x01\x04\x00"

答案 2 :(得分:1)

您应该通过标准输入而不是命令行传递数据。您可以使用IO.popen来实现此目的:

IO.popen("./app/animations/fade.sh", "w+") do |f| 
  f.write "\x01\x01\x04\x00"
end

在阅读方面:

input = $stdin.read
@sp.write [input, "f", "\x12"]

(顺便说一下,命名Ruby脚本.rb而不是.sh更常见;如果fade.sh是一个Ruby脚本,我假设您使用的语法在其示例内容中,您可能希望将其命名为fade.rb