1

我正在尝试将特定的字符串转换为字节 []。

字符串看起来像: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};
4

4 回答 4

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. 但是,如果您解析 anint然后使用缩小转换为byte,您将得到结果。

于 2012-05-09T21:20:40.130 回答
0

看起来您只是在循环使用空格分隔的 String 并解析 Byte 对象。在这种情况下,我建议使用类似的东西:

         String text = "";
         String[] strArr = text.split(" ");
         for (String str: strArr)
         {
             //convert string to byte here
         }
于 2012-05-09T21:18:59.190 回答
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()因为 Byte 不是无符号字节。我试过了String text = "55555FFF";

于 2012-05-09T21:24:50.933 回答
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;
}
于 2012-05-09T21:43:15.240 回答