2009-07-28 61 views
10

我試圖通過套接字發送一系列二進制字節,以符合我公司使用的特定標準。我公司以前沒有人使用過Ruby,但在其他語言中,他們一次只發送一個字節的數據(通常採用某種「包裝」方法)。Ruby如何處理字節/二進制文件?

我無法找到創建二進制文件,或創建字節(最接近我可以找到它如何將字符串轉換爲字節表示它的字符)。

我知道你可以這樣說:

@var = 0b101010101

但我怎麼轉換爲字符串的形式爲「101010101」,或當我做string.to_i創建的結果的整數(2 )變成一個實際的二進制。如果我只是將字符串發送到套接字上,那麼是不是隻發送「0」和「1」而不是文字字符的ASCII?

當然,有一些方法可以在Ruby本地執行此操作?

回答

10

爲了使具有任意字節序列的字符串,做這樣的事情:

binary_string = "\xE5\xA5\xBD" 

的「\ x」是一個特殊的轉義編碼從十六進制的任意字節,因此「 \ xE5「表示字節0xE5。

然後嘗試在套接字上發送該字符串。

9

看看String.unpack方法。這是一個例子:

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

這會給你整數值。有更多的方式來進行轉換。

+0

在這篇文章被編輯之前,它告訴我關於Array.pack。我不太明白這一點。如果我有: @bob = [「111111111」,「1000」,「1111」]或其他,然後我說: @ bob.unpack(b *),它顯示如下所示:「/ 377」這是正確的二進制文件嗎?這不僅僅是數組的第一個元素嗎?我將如何讓它做整個陣列? – Jenny 2009-07-28 13:05:37

+0

Array.pack與String.unpack相反。在你的例子中,bob.pack('b *')只打包數組的第一個元素。你可能想要bob.pack('b * b * b *')。然而,這與你在問題中所要求的有所不同。 – kgiannakakis 2009-07-28 13:55:48

14

不知道這是否足夠有幫助,但你可以索引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