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

12

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

我找不到任何方法来即时创建二进制或创建字节(最接近的是将字符串转换为代表其字符的字节)。

我知道你可以这样写:

@var = 0b101010101

但如果我想将形式为“101010101”的字符串或使用string.to_i(2)创建的结果整数转换为实际的二进制,该怎么办?如果我只是将字符串发送到套接字上,那么发送的是否只是“0”和“1”的 ASCII 码而不是文字本身?

肯定有某种本地的 Ruby 方法可以做到这一点吧?

3个回答

17

不确定这是否足够有帮助,但你可以在 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

12

要创建一个包含任意字节序列的字符串,可以像这样操作:

binary_string = "\xE5\xA5\xBD"

"\x"是一种特殊的转义方式,用于将任意一个字节编码为十六进制数,因此"\xE5"表示字节0xE5。

然后尝试通过套接字发送该字符串。


为什么二进制字符串中会有一些“/”? - why
2
一个二进制字符串很可能有一个值为0x2F(47)的字节。这是“/”的ASCII编码,所以如果你使用inspect检查该字符串,Ruby通常会打印出“/”。对于任何ASCII字符都是一样的。Ruby实际上并不知道你的字符串是否是“二进制字符串”,对于Ruby来说,你的字符串基本上是一系列字节(除了在1.9中添加了一些编码信息)。 - David Grayson

10

请查看String.unpack 方法。这是一个示例:

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

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


在这篇帖子被编辑之前,它告诉我有关Array.pack的信息。我不太理解这个。如果我有:@bob = ["111111111", "1000", "1111"] 或者其他什么,然后我说:@bob.unpack(b*),它会显示类似于:"/377" 这是正确的二进制吗?那不只是数组的第一个元素吗?我该如何让它处理整个数组? - J.R.
Array.pack是String.unpack的反义词。在你的例子中,bob.pack('b*')仅打包数组的第一个元素。你可能想要使用bob.pack('bbb*')。但是这与你在问题中所询问的内容不同。 - kgiannakakis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接