2017-09-13 83 views
1

我有下面的代碼,以十六進制字符串轉換爲字節在Java中:十六進制字節,紅寶石和Java

String s = "longhex"; 
int len = s.length(); 
byte[] data = new byte[(len/2)]; 
for (int i = 0; i < len; i += 2) 
{ 
    data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16)); 
} 

這是重現它在紅寶石以正確的方式?

s = "longhex" 
bytes = [] 
(0..s.length/2 - 1).step(2).each do |i| 
    bytes[i/2] = s[i].ord << 4 + s[i + 1].ord 
end 
+0

我得到的錯誤,當我運行Java代碼,異常在線程「主要」 java.lang.StringIndexOutOfBoundsException:字符串索引超出範圍:7 – Mohanraj

+0

這是becase的實際字符串更長'43cfde6a0996a389cd2df5a2c5bd680d44ff77534364446f96621719c4dc3f6b88ff61304ac4856e04403e0d1df446e79592c2b80352ed06c262a3a1f75bae47' –

+0

所以,你想要將十六進制字符串轉換爲十進制字節,我是否正確? – Mohanraj

回答

1

不,這是不正確的。 <<的運算符優先級低於+。請注意,即使在java中,移位運算符周圍也有括號。此外,它不是ruby,它是用幾乎ruby語法編寫的

str.codepoints. 
    each_slice(2). 
    map { |f, l| (f << 4) + l } 

可能會做你想要的,但沒有看到預期的結果,這很難說。

正確版本伊利亞是:

str.scan(/.{1}/). 
    each_slice(2). 
    map { |f, l| (Integer(f,16) << 4) + Integer(l,16) } 
+0

我需要編輯一下's.scan(/。{1} /)。each_slice(2)。 map {| f,l | (整數(f,16)<< 4)+整數(l,16)}' –

+0

@IlyaCherevkov謝謝,我已經更新了相應的答案。 – mudasobwa

相關問題