2012-05-09 25 views
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 raw[] = {(byte) 0x55, (byte) 0x55, (byte) 0x5F,(byte) 0xFF,(byte) 0xFF}; 
+0

对不起,它的错误。当我使用“raw = text.getBytes();”我得到了一个有14个职位的数组,但我需要一个5个像我的问题中的最后一个代码块。 – Jay

+0

如果您查看“Byte.valueOF”的文档,它会指向'parseByte',其中指出“字符串中的字符必须全部为十进制数字,但第一个字符可能是ASCII减号” 。这就是为什么当你给它一个“F”时它会爆炸。 –

+2

哦,现在我明白了 - 我认为这个适合:http://stackoverflow.com/questions/140131/convert-a-string-representation-of-a-hex-dump-to-a-byte-array-using -java – birryree

回答

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,你会得到你的结果。

0

看起来你只是通过一个空格分隔字符串循环,并解析出字节的对象。在这种情况下,我建议使用类似:

  String text = ""; 
     String[] strArr = text.split(" "); 
     for (String str: strArr) 
     { 
      //convert string to byte here 
     } 
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";

+0

你的代码产生'Type mismatch:can not convert from int to byte',但它很容易修复。 –

+0

@MarkoTopolnik oops,使用'GroovyConsole'对其进行了测试 – user845279

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

您是否测试了它? 'java.lang.NumberFormatException:值超出范围。价值:“F5”基数:16'虽然不是一个大问题。 –

+0

我明白了。谢谢! –