簡體   English   中英

如果我使用C#和Java,則從BigIntger到byte []的轉換不同

[英]Different conversion from BigIntger to byte[] if I use C# and Java

如果具有以下BigInteger:

1379080579050447841330186236235223160927998000398161138225875482305250883605652677639242794753995315199229112894647269426499088162253680340518114657361569012095908691691924534414360438924914998

如果我在C#中使用ToByteArray轉換為byte[]ToByteArray得到結果,但是如果在Java中轉換相同的BigInteger ,則會得到不同的結果。 如何獲得相同的結果? 我需要byte[]因為我需要刪除填充,然后將字節數組轉換為字符串

正如評論中指出的那樣,您看到C# BigIntegerbyte[]與Java BigInteger值不同的原因是字節順序相反:C#是little-endian,而Java是big-endian (有關更多詳細信息,請參見Java與C#:BigInteger十六進制字符串會產生不同的結果? )。

如您所見,數組中字節的順序完全相反:

C#

BigInteger bi = BigInteger.Parse("1379080579050447841330186236235223160927998000398161138225875482305250883605652677639242794753995315199229112894647269426499088162253680340518114657361569012095908691691924534414360438924914998");
byte[] ba = bi.ToByteArray();
for (int i = 0; i < ba.Length; i++) {
    Console.Write(ba[i] + " ");
}
// 54 49 48 50 47 52 48 47 49 50 32 111 110 114 111 105 103 32 44 98 117 108 67 
// 32 97 116 105 118 69 32 44 101 108 97 117 113 115 97 80 32 101 110 111 105 108 
// 103 101 86 32 111 116 110 101 118 69 32 44 52 57 57 49 47 56 48 47 49 50 32 44 
// 105 115 115 111 82 32 111 99 114 97 77 

爪哇

BigInteger bi = new BigInteger("1379080579050447841330186236235223160927998000398161138225875482305250883605652677639242794753995315199229112894647269426499088162253680340518114657361569012095908691691924534414360438924914998");
byte[] ba = bi.toByteArray();
for (int i = 0; i < ba.length; i++) {
    System.out.print(ba[i] + " ");
}
// 77 97 114 99 111 32 82 111 115 115 105 44 32 50 49 47 48 56 47 49 57 57 52 44 
// 32 69 118 101 110 116 111 32 86 101 103 108 105 111 110 101 32 80 97 115 113 117 
// 97 108 101 44 32 69 118 105 116 97 32 67 108 117 98 44 32 103 105 111 114 110 111 
// 32 50 49 47 48 52 47 50 48 49 54 

如果希望Java byte[]以與C#相同的順序保存字節,則需要反轉其內容。

您可以編寫一個簡單的幫助程序方法,該方法可以反轉數組中字節的順序:

public static void reverse(byte[] array) {
    for (int i = 0, j = array.length - 1; i < j; i++, j--) {
        byte b = array[i];
        array[i] = array[j];
        array[j] = b;
    }
}

或者,如果您有權訪問第三方庫,則可以使用org.apache.commons.lang3.ArrayUtils.reverse(byte[])

這將為您提供Java中的byte[] ,以與C#相同的順序保存字節:

爪哇

BigInteger bi = new BigInteger("1379080579050447841330186236235223160927998000398161138225875482305250883605652677639242794753995315199229112894647269426499088162253680340518114657361569012095908691691924534414360438924914998");
byte[] ba = bi.toByteArray();
reverse(ba);
for (int i = 0; i < ba.length; i++) {
    System.out.print(ba[i] + " ");
}
// 54 49 48 50 47 52 48 47 49 50 32 111 110 114 111 105 103 32 44 98 117 108 67 
// 32 97 116 105 118 69 32 44 101 108 97 117 113 115 97 80 32 101 110 111 105 108 
// 103 101 86 32 111 116 110 101 118 69 32 44 52 57 57 49 47 56 48 47 49 50 32 44 
// 105 115 115 111 82 32 111 99 114 97 77 

暫無
暫無

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

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