我需要將數值轉換爲字節數組。例如,長轉換爲字節數組,我有這樣的方法:有沒有解釋這個Java ByteBuffer的行爲?
public static byte[] longToBytes(long l) {
ByteBuffer buff = ByteBuffer.allocate(8);
buff.order(ByteOrder.BIG_ENDIAN);
buff.putLong(l);
return buff.array();
}
這是非常簡單的 - 需要很長的,分配,可容納一個數組,並在那裏把它。不管l
的值是什麼,我都會得到一個8字節的數組,然後我可以按照預期進行處理和使用。就我而言,我正在創建一個自定義的二進制格式,然後通過網絡傳輸它。
當我調用此方法的值爲773450364時,我得到一個數組[0 0 0 0 46 25 -22 124]
回來。我有代碼,也字節數組轉換回它們的數值:
public static Long bytesToLong(byte[] aBytes, int start) {
byte[] b = new byte[8];
b[0] = aBytes[start + 0];
b[1] = aBytes[start + 1];
b[2] = aBytes[start + 2];
b[3] = aBytes[start + 3];
b[4] = aBytes[start + 4];
b[5] = aBytes[start + 5];
b[6] = aBytes[start + 6];
b[7] = aBytes[start + 7];
ByteBuffer buf = ByteBuffer.wrap(b);
return buf.getLong();
}
當我通過從其他方法返回到該方法中,陣列,我得到773450364,這是正確的。
現在,我通過TCP傳輸這個數組到另一個Java客戶端。 java.io.InputStream.read()
方法的文檔說,它返回的值爲0到255之間的一個int
值,除非到達流的末尾並返回-1。但是,當我使用它來填充字節數組時,我會繼續在接收端獲取負值。我懷疑這與溢出有關(值爲255不能適合Java字節,所以當我把它放入字節數組時,它溢出並變爲負數)。
這給我帶來了我的問題。負數的存在與我有關。現在,我正在開發應用程序的Java端,其中一個字節介於-128和127之間。另一個端點可能是C,C++,Python,Java,C#......誰知道。我不確定某些字節數組中負值的存在是如何影響處理的。 除了記錄這種行爲之外,還有什麼可以/應該如何讓自己和未來的開發人員更容易在本系統上工作,特別是在未使用Java編寫的端點中?
在將'getLong()'調用到'longToBytes'中之前,你不應該在你的'bytesToLong'方法中設置ByteBuffer的字節順序嗎?不是真的與你的問題有關,只是想知道... –
@G_H我應該看看並測試。我其實並沒有自己寫這兩種方法,測試用例也缺乏。感謝您指出了這一點。 –