如何将字节数组转换为Java中的字符串,然后跳过所有null字节



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

相关内容

最新更新