i有一个字节数组,该字节数组在数组末端包含一个字符串,并且数组的开头用零填充。我正在使用以下代码将其转换为字符串:
String myText = new String(byteArray, "UTF-8");
但是,由于0填充,我会得到一堆奇怪的字符。我如何摆脱它?
谢谢。
使用String(byte[], int, int, String)
构造函数。
第一个int
是通过byte[]
的偏移量:只需查找第一个非零字节即可;第二个int
是字节数。因此,打电话给:
new String(
byteArray, firstNonNullByte, byteArray.length - firstNonNullByte, "UTF-8");
无需循环以查找填充的何处,您可以使用Regex修复字符串。与循环的索引杂耍是危险的,因为这将是有一天会引入多个错误的理想场所。
String myText = (new String(byteArray, "UTF-8")).replaceAll("^\x00*", "");
REGEX表示:
- 在字符串(
^
)的开头 - 具有十六进制代码0的字符(
x00
,应该在Java中逃脱,因此
\x00
) - 零或更多次(
*
)
我的解决方案是从数组的开头删除零:
public byte[] trim(byte[] bytes) {
int i = 0;
while (i<bytes.length && bytes[i] == 0) {
i++;
}
return Arrays.copyOfRange(bytes, i, bytes.length);
}
您可以使用apache org.apache.commons.lang3.arrayutils。
int firstNonNullByte = ArrayUtils.lastIndexOf(byteArray, 0) + 1;
我会尝试删除领先的零,然后只使用有用的byte
数组的其余部分:
public class Test {
public static byte[] removeZeroes(byte[] data) {
int i;
for(i = 0; i < data.length; i++) {
if(data[i] != ' ') {
break;
}
}
return Arrays.copyOfRange(data, i, data.length);
}
public static void main(String args[]) {
byte[] byteArray = new byte[10];
byteArray[0] = ' ';
byteArray[1] = ' ';
byteArray[2] = ' ';
byteArray[3] = ' ';
byteArray[4] = 's';
byteArray[5] = 't';
byteArray[6] = 'r';
byteArray[7] = 'i';
byteArray[8] = 'n';
byteArray[9] = 'g';
byteArray = removeZeroes(byteArray);
try {
String myText = new String(byteArray, "UTF-8");
System.out.println(myText);
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}