Java 将特定字符串转换为字节[]

Java 将特定字符串转换为字节[],java,string,byte,Java,String,Byte,我正在尝试将特定字符串转换为字节[] 字符串如下所示: 55层5楼及以上 这是我为它写的方法,希望有人能告诉我哪里错了,或者有更好的解决方案 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 =

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

字符串如下所示: 55层5楼及以上

这是我为它写的方法,希望有人能告诉我哪里错了,或者有更好的解决方案

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;
}

看起来你只是在一个空格分隔的字符串中循环,然后解析出字节对象。在这种情况下,我建议使用以下方法:

         String text = "";
         String[] strArr = text.split(" ");
         for (String str: strArr)
         {
             //convert string to byte here
         }
这将有助于:

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
,然后使用缩小转换为
字节
,您将得到您的结果。

字节[]原始=新字节[text.length()>>1];
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);
}
对于(inti=0;i>1]=Integer.parseInt(text.substring(i,i+2),16); }

我使用了
Integer.parseInt()
而不是
Byte.parseByte()
,因为字节不是无符号字节。我使用
String text=“5555555 fff”
尝试了它,您也可以对每个令牌使用
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;
}
公共静态字节[]字符串字节(字符串文本){
StringTokenizer st=新的StringTokenizer(文本);
字节原始[]=新字节[st.countTokens()];
for(int i=0;i
不抱歉,这是错误的。当我使用“raw=text.getBytes();”时,我得到一个有14个位置的数组,但我需要一个有5个位置的数组,就像我问题中的最后一个代码块一样。如果你看一下
Byte.valueOF
的文档,它会指向
parseByte
,上面写着字符串中的字符必须全部为十进制数字,但第一个字符可以是ASCII减号“。这就是为什么当你给它一个
F
时它会爆炸。哦,现在我明白了-我认为这一个合适:你的代码产生
类型不匹配:不能从int转换到byte
,但很容易修复。@MarkoTopolnik oops,用
GroovyConsole
对它进行了测试吗?
java.lang.NumberFormatException:值超出范围。值:“F5”基数:16
但不是一个需要修正的大问题。
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;
}