从Java中的HEX字符串创建ISO-8859-1字符串,移位
我试图将HEX序列转换为以ISO-8859-1,UTF-8或UTF-16BE编码的字符串。也就是说,我有一个字符串,如下所示:"0422043504410442"
这表示UTF-16BE中的字符:。从Java中的HEX字符串创建ISO-8859-1字符串,移位
我用两种格式之间进行转换的代码是:
private static String hex2String(String hex, String encoding) throws UnsupportedEncodingException {
char[] hexArray = hex.toCharArray();
int length = hex.length()/2;
byte[] rawData = new byte[length];
for(int i=0; i<length; i++){
int high = Character.digit(hexArray[i*2], 16);
int low = Character.digit(hexArray[i*2+1], 16);
int value = (high << 4) | low;
if(value > 127)
value -= 256;
rawData[i] = (byte) value;
}
return new String(rawData, encoding);
}
这似乎为我工作得很好,但我还是对这次两个问题:
- 有没有更简单方式(最好没有位处理)做这种转换?
- 我该如何解释该行:
int value = (high << 4) | low;
?
我很熟悉位处理的基础知识,尽管没有Java语法。我相信第一部分将所有位左移4步。尽管其他我不明白,为什么它会在这种情况下有所帮助。
对于我的问题中的任何混淆,我表示抱歉,请让我知道我是否应该澄清任何事情。 谢谢。 // Abeansits
有没有什么简单的方法(最好不位处理)做这种转换?
无我会知道的 - 唯一的简化似乎(例如,使用int value = Integer.parseInt(hex.substring(i * 2, i * 2 + 2), 16);
)
public static byte[] hexToBytes(final String hex) {
final byte[] bytes = new byte[hex.length()/2];
for (int i = 0; i < bytes.length; i++) {
bytes[i] = (byte) Integer.parseInt(hex.substring(i * 2, i * 2 + 2), 16);
}
return bytes;
}
我怎么解释线分析整个字节一次,而不是解析由数字位数:INT值=(高< < 4)|低;?
看看这个例子您的最后两位数字(42):
int high = 4; // binary 0100
int low = 2; // binary 0010
int value = (high << 4) | low;
int value = (0100 << 4) | 0010; // shift 4 to left
int value = 01000000 | 0010; // bitwise or
int value = 01000010;
int value = 66; // 01000010 == 0x42 == 66
您可以*
和+
取代在这种情况下<<
和|
,但我不建议这样做。
表达
int value = (high << 4) | low;
相当于
int value = high * 16 + low;
256的减法之间-128和127是不必要的得到的值。简单地将128例如转换为一个字节将产生正确的结果。 int
128的最低8位具有与byte
-128:0x80相同的模式。
我想它只是写为:
rawData[i] = (byte) ((high << 4) | low);
有没有什么简单的方法(最好 无位处理)做到这一点 转换?
您可以在Apache共享中使用Hex类,但在内部它可以做同样的事情,可能会有细微差别。
我该如何解释该行:
int value = (high << 4) | low;
?
这将两个十六进制数字组合成一个无符号的8位数值,其中每个数字代表4位,存储为int
。接下来的两行将其转换为签名的Java byte
。