2016-08-01 70 views
1

我的應用程序的工作轉換與SMSC,我需要得到的短信涉及其發送之前,紅寶石如何回二進制字符串從SMSC

我試圖從移動發送串

"hello this is test"

當我檢查我得到了我的文字這是二進制字符串的SMSC:

userData = "c8329bfd06d1d1e939283d07d1cb733a" 

這個字符串的編碼是:

<Encoding:ASCII-8BIT> 

我知道,這可能是用戶數據在GSM編碼的二進制串

所以如何從用戶數據後面的明文字符串得到什麼?

這個問題是英朗,因爲在希伯來語我可以取回 字符串與此代碼:

[userData].pack('H*').force_encoding('utf-16be').encode('utf-8')

但在英語我得到錯誤:

Encoding::InvalidByteSequenceError: "\xDA\xF3" followed by "u" on UTF-16BE 

我試圖檢測ICU的二進制字符串,我得到:

「ISO-8859-1」,檢測到的語言是:'PT',非常奇怪的原因是我的語言是英語或希伯來語。

反正我失去了與編碼的東西,所以我嘗試從Encoding.list

,但沒有運氣編碼到列表中的每名到現在爲止

在此先感謝

Shmulik

回答

0

OK ,

對於誰也有這個問題,我得到了解決方案,感謝#ruby irc community(i mis SED他的綽號)

解決的辦法是:

ASCII字符是插成二進制:

你需要的是:

"c8329bfd06d1d1e939283d07d1cb733a".scan(/../).reverse_each.map { |h| h.to_i(16) }.pack('C*').unpack('B*')[0][2..-1].scan(/.{7}/).map.with_object("") { |x, s| s << x.to_i(2) }.reverse 

記得我送這句話在短信:

"hello this is test"

而且它h作爲成爲以二進制:

"c8329bfd06d1d1e939283d07d1cb733a"

,我在任何編碼得到垃圾原因是,因爲該ASCII字符是7位GSM,所以只有第一個7位代表的數據,但每一個其他編碼使用至少8位,從而使代碼實際上做了什麼。

但是,這只是爲ascii字符集。

在另一種語言就像我用希伯來文中,發送短信爲UCS2

所以對我來說這段代碼的工作:

[your_binary_string].pack('H*').force_encoding('utf-16be').encode('utf-8') 

非常重要的將二進制字符串數組

這樣一切就可以了。

如果有人想翻譯和解釋在ASCII代碼中發生了什麼,請成爲我的客人和歡迎。

Shmulik