簡體   English   中英

如何在Java中將字節數組轉換為String,並跳過所有空字節?

[英]How to convert a byte array to a String in Java, and skip all null bytes?

我有一個字節數組,在數組末尾包含一個字符串,並且數組的開頭填充了零。 我正在使用以下代碼將其轉換為字符串:

String myText = new String(byteArray, "UTF-8");

但是,由於填充為0,我在字符串前得到了一堆奇怪的字符。 我如何擺脫它?

謝謝。

使用String(byte[], int, int, String)構造函數。

第一個intbyte[]的偏移量:只查找第一個非零字節; 第二個int是字節數。 因此,呼叫方式如下:

new String(
    byteArray, firstNonNullByte, byteArray.length - firstNonNullByte, "UTF-8");

您可以使用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] != '\0') {
            break;
        }
    }
    return Arrays.copyOfRange(data, i, data.length);
}

public static void main(String args[]) {
    byte[] byteArray = new byte[10];
    byteArray[0] = '\0';
    byteArray[1] = '\0';
    byteArray[2] = '\0';
    byteArray[3] = '\0';
    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();
    }

}

我的解決方案是從數組的開頭刪除零:

public byte[] trim(byte[] bytes) {
        int i = 0;
        while (i<bytes.length && bytes[i] == 0) {
            i++;
        }

        return Arrays.copyOfRange(bytes, i, bytes.length);        
 }

無需循環查找填充的結束位置,即可使用正則表達式修復字符串。 使用循環處理索引很危險,因為它是一天引入一個錯誤的理想之地。

String myText = (new String(byteArray, "UTF-8")).replaceAll("^\\x00*", "");

正則表達式是指:

  • 在字符串( ^ )的開頭
  • 十六進制代碼為0的字符( \\x00\\應該在Java中轉義,因此\\\\x00
  • 零次或多次( *

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM