簡體   English   中英

將十六進制字符串轉換為字節數組

[英]converting hexadecimal string to byte array

我編寫了一個將十六進制字符串轉換為字節數組的程序,例如"2e65"生成[2,14,6,5]

有沒有辦法用更少的代碼行或不使用 ASCII 表值來做到這一點。

public static byte[] stringToData( String dataString) {
    byte [] hexStringToByteArr = new byte[dataString.length()];
    for ( int i = 0; i < dataString.length(); i++) {
        char c = dataString.charAt(i);
        if ( c == 48 ) { hexStringToByteArr[i] = 0;}
        if ( c == 49 ) { hexStringToByteArr[i] = 1;}
        if ( c == 50 ) { hexStringToByteArr[i] = 2;}
        if ( c == 51 ) { hexStringToByteArr[i] = 3;}
        if ( c == 52 ) { hexStringToByteArr[i] = 4;}
        if ( c == 53 ) { hexStringToByteArr[i] = 5;}
        if ( c == 54 ) { hexStringToByteArr[i] = 6;}
        if ( c == 55 ) { hexStringToByteArr[i] = 7;}
        if ( c == 56 ) { hexStringToByteArr[i] = 8;}
        if ( c == 57 ) { hexStringToByteArr[i] = 9;}
        if ( c == 97 ) { hexStringToByteArr[i] = 10;}
        if ( c == 98 ) { hexStringToByteArr[i] = 11;}
        if ( c == 99 ) { hexStringToByteArr[i] = 12;}
        if ( c == 100 ) {hexStringToByteArr[i] = 13;}
        if ( c == 101 ) {hexStringToByteArr[i] = 14;}
        if ( c == 102 ) {hexStringToByteArr[i] = 15;}
    }
    return hexStringToByteArr;
}

public static void main(String [] args) {
    String pracString = "2e65";    
    System.out.println(Arrays.toString(stringToData(pracString)));
}

十六進制中的"2e65"代表兩個字節( 2e ,對應於十進制的4665 ,對應於十進制的101 )。 要獲取包含兩個字節的byte[] ,您可以使用BigInteger

String hex = "2e65";
byte[] b = new BigInteger(hex, 16).toByteArray();
System.out.println(Arrays.toString(b));

上面代碼片段的輸出是:

[46, 101]

相反,如果您想將四個十六進制數字中的每一個都轉換為一個byte並將它們存儲在byte[] ,那么您可以在迭代String每個char時使用Character#digit

String hex = "2e65";
byte[] b = new byte[hex.length()];

for (int i = 0; i < b.length; i++) {
    b[i] = (byte) Character.digit(hex.charAt(i), 16);
}

System.out.println(Arrays.toString(b));

上面代碼片段的輸出是:

[2, 14, 6, 5]

要將十六進制字符串轉換為字節數組,您需要首先獲取給定字符串的長度並在創建新字節數組時包含它。

string str = "2e65";
byte[] val = new byte[str.length() / 2];

現在,使用 for 循環直到字節數組的長度。

for (int i = 0; i < val.length; i++) {
   int index = i * 2;
   int j = Integer.parseInt(str.substring(index, index + 2), 16);
   val[i] = (byte) j;
}

所以,由於字節數組必須是長度的一半,改變這一行

byte[] hexStringToByteArr = new byte[dataString.length()];

對此:

byte[] hexStringToByteArr = new byte[dataString.length() / 2];

您的大塊 o' ifs 可以替換為:

hexStringToByteArr[i] = c < 58 ? c - 48 : c - 87;

暫無
暫無

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

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