Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby如何处理字节/二进制?_Ruby_Binary_Byte - Fatal编程技术网

Ruby如何处理字节/二进制?

Ruby如何处理字节/二进制?,ruby,binary,byte,Ruby,Binary,Byte,我试图通过套接字发送一系列二进制字节,以满足我公司使用的特定标准。我公司以前没有人使用过Ruby,但在其他语言中,他们一次发送一个字节的数据(通常使用某种“打包”方法) 无论如何,我找不到动态创建二进制文件或创建字节的方法(我能找到的最接近的方法是如何将字符串转换为表示其字符的字节) 我知道你可以这样说: @var=0b101010101 但是,如何将“101010101”形式的字符串或执行string.to_I(2)时创建的结果整数转换为实际的二进制文件呢。如果我只是通过套接字发送字符串acc

我试图通过套接字发送一系列二进制字节,以满足我公司使用的特定标准。我公司以前没有人使用过Ruby,但在其他语言中,他们一次发送一个字节的数据(通常使用某种“打包”方法)

无论如何,我找不到动态创建二进制文件或创建字节的方法(我能找到的最接近的方法是如何将字符串转换为表示其字符的字节)

我知道你可以这样说:

@var=0b101010101

但是,如何将“101010101”形式的字符串或执行string.to_I(2)时创建的结果整数转换为实际的二进制文件呢。如果我只是通过套接字发送字符串accross,那么它不只是发送“0”和“1”的ASCII而不是文本字符吗

当然在Ruby中有一些方法可以实现这一点吗?

看看这个方法。这是一个例子:

str = "1010"
str.unpack("cccc")
=> [49, 48, 49, 48]

这将为您提供整数值。有更多的方法可以进行转换。

不知道这是否有足够的帮助,但您可以在ruby中用整数对位进行索引

n = 0b010101

n # => 21

n = 21

n[0]  # => 1
n[1]  # => 0
n[2]  # => 1
n[3]  # => 0
n[4]  # => 1
n[5]  # => 0

要生成具有任意字节序列的字符串,请执行以下操作:

binary_string = "\xE5\xA5\xBD"
“\x”是从十六进制编码任意字节的特殊转义,因此“\xE5”表示字节0xE5


然后尝试在套接字上发送该字符串。

在编辑本文之前,它告诉我有关Array.pack的信息。我不太明白这一点。如果我有:@bob=[“111111111”,“1000”,“1111”]或其他什么,然后我说:@bob.unpack(b*),它会显示类似这样的内容:“/377”这是正确的二进制文件吗?这不是数组的第一个元素吗?我要它如何处理整个数组?array.pack与String.unpack相反。在您的示例中,bob.pack('b*')只是打包数组的第一个元素。您可能需要bob.pack('bbb*')。然而,这与您在问题中所要求的有所不同。为什么二进制字符串中有一些“/”?二进制字符串很可能有一个值为0x2F(47)的字节。这是“/”的ASCII编码,因此如果您
inspect
字符串Ruby通常会打印出“/”。这同样适用于任何ASCII字符。Ruby实际上不知道您的字符串是否是“二进制字符串”,对于Ruby来说,您的字符串基本上是一个字节序列(除了在1.9中添加了一些编码信息)。谢谢!这对我很有帮助