我有以下代码将十六进制字符串转换为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));
}
这是在ruby中重现它的正确方法吗?
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 :(得分:1)
不,这不对。 <<
的运算符优先级低于+
。请注意,即使在java中,shift运算符周围也有括号。此外,它不是ruby,它是c用几乎ruby语法编写的。
str.codepoints.
each_slice(2).
map { |f, l| (f << 4) + l }
可能会做你想要的,但没有看到预期的结果,很难说。
Ilya的正确版本是:
str.scan(/.{1}/).
each_slice(2).
map { |f, l| (Integer(f,16) << 4) + Integer(l,16) }