我正在尝试将特定的String转换为byte []。
String看起来像: 55 55 F5 FF FF
这是我为它写的方法,希望有人可以告诉我什么是错的或有更好的解决方案。
public static byte[] stringToByte(String text) {
//byte[] length ==> String (length+1)/3
byte raw[] = new byte[(text.length() + 1) / 3];
int j = 0;
for (int i = 0; i < text.length(); i += 2) {
String h = "";
h += text.charAt(i);
h += text.charAt(i + 1);
i++;
raw[j] = Byte.valueOf(h);
j++;
}
return raw;
}
问题是它在F5之前有效。
我需要在byte []中使用相同的值,就像我使用
一样byte raw[] = {(byte) 0x55, (byte) 0x55, (byte) 0x5F,(byte) 0xFF,(byte) 0xFF};
答案 0 :(得分:2)
这将有效:
public static byte[] stringToByte(String text) {
final String[] split = text.split("\\s+");
final byte[] result = new byte[split.length];
int i = 0;
for (String b : split) result[i++] = (byte)Integer.parseInt(b, 16);
return result;
}
为什么呢? byte
是已签名的数量,您无法将其范围之外的任何内容直接解析为byte
。但是,如果您解析int
然后使用缩小转换为byte
,您将获得结果。
答案 1 :(得分:0)
看起来你只是循环一个以空格分隔的String并解析出Byte对象。在这种情况下,我建议使用类似的东西:
String text = "";
String[] strArr = text.split(" ");
for (String str: strArr)
{
//convert string to byte here
}
答案 2 :(得分:0)
byte[] raw = new byte[text.length() >> 1];
for(int i=0; i<text.length();i+=2){
raw[i >> 1] = Integer.parseInt(text.substring(i, i+2),16);
}
我使用Integer.parseInt()
而不是Byte.parseByte()
,因为字节不是无符号字节。我用String text = "55555FFF";
尝试了它。
答案 3 :(得分:0)
您还可以为每个令牌使用StringTokenizer
。
public static byte[] stringToByte(String text) {
StringTokenizer st = new StringTokenizer(text);
byte raw[] = new byte[st.countTokens()];
for (int i = 0; i < raw.length; i++) {
raw[i] = (byte) Integer.parseInt(st.nextToken(), 16);
}
return raw;
}