我从ajax通过javascript发送了一个字节数组,如下所示:
"89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,01,98,00,00,00,e4,08,06,00 ..."
我想将此字符串转换为字节数组。 与此问题非常相似,但使用的是Java:Convert String[] to byte[] array
编辑: 这似乎有效 - 但不确定我做得对吗
String[] byteData ="89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,01,98,00,00,00,e4,08,06,00";
byte[] b = new byte[byteData.length];
for (int i = 0; i < byteData.length; i++) {
BigInteger bla = BigInteger.valueOf(Integer.parseInt(byteData[i].trim(), 16) - 128);
b[i] = bla.toByteArray()[0];
}
答案 0 :(得分:0)
这是一个简单的JAVA解决方案:
String bytes="89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,01,98,00,00,00,e4,08";
String []tab=bytes.split(",");
Integer []b = new Integer[tab.length];
for(int i = 0 ; i < tab.length ; i++){
if(tab[i].matches("[-+]?\\d*\\.?\\d+"))
b[i]=Integer.parseInt(tab[i]);
else
b[i]=Integer.parseInt(tab[i],16);
}
答案 1 :(得分:0)
编辑:实际上,由于this,parseByte对您的案例似乎不是一个安全的选择,因此我从this answer获取灵感来改变它。
你可以这样做:
String bytesAsStringWithCommas = "89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,01,98,00,00,00,e4,08,06,00 ...";
String[] bytesStr = bytesAsStringWithCommas.split(",");
byte[] byteArray = new byte[bytesStr.length];
for (int j = 0; j < bytesStr.length; j++) {
byteArray[j] = (byte) ((Character.digit(bytesStr[j].charAt(0), 16) << 4) + Character.digit(bytesStr[j].charAt(1), 16));
}
您应该更改服务器代码或客户端代码以直接发送数据,而不是使用像这样的复杂解决方案。或者您也可以使用Base64编码,这将比您当前的解决方案更好。
答案 2 :(得分:0)
你可以试试这个
String response ="89,50,47,00,00,00,49,48,44,52,00,00,01,98,00,00,00,08";
List<Byte> byteList = Arrays.stream(response.split(","))
.map(Byte::parseByte)
.collect(Collectors.toList());
与之前相同但使用流xD
但是你的例子在4e,0d上抛出NumberFormatException等等
答案 3 :(得分:0)
尝试以下代码(输出是转换结果):
String input = "89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,01,98,00,00,00,e4,08";
String[] hex = input.split(",");
char[] chars = new char[hex.length];
for (int i = 0; i < hex.length; i++) {
chars[i] = (char) Integer.parseInt(hex[i], 16);
}
String output = new String(chars);