簡體   English   中英

負數的字節序轉換?

[英]Endian conversion for negative number?

目前我正在從事一個網絡項目,在該項目中我將長數據(64 位)轉換為大端,然后再通過套接字發送。 為此,我使用 htobe64(x) function。 在接收端客戶端,我使用 be64toh(x) function 從大端轉換為主機字節順序。 這對於像 (132) 這樣的正數工作正常,但是當數字為負數 (-132) 高於 function 時會返回一些模糊的數字。 我很困惑為什么即使我使用上面的標准功能也會發生這種情況。 目前在 ubuntu (linux) 機器上測試客戶端和服務器。

例如見下面的代碼。

long a = -132;

cout << "=========" << endl;
cout << "a = " << a << endl;
cout << "htobe64 = " << htobe64(a) << endl;
long b = htobe64(a);
cout << "be64toh = " << be64toh(b) << endl;
cout << "=========" << endl;

output 是:

=========
a = -132
htobe64 = 9007199254740991999
be64toh = 18446744073709551484
=========

這適用於正數。

=========
a = 132
htobe64 = 9511602413006487552
be64toh = 132
=========

htobe64返回類型 uint64_t,不長。 值 18446744073709551484 是二進制補碼 -132 的無符號 64 位表示。 = 0xffffffffffffff7c

cout << "be64toh = " << be64toh(b) << endl; function be64toh接受並返回base64_t因此cout將位序列打印為無符號。 因此,您看到的位序列的無符號解釋。 一般來說,有符號數以 2 的補碼方法表示(盡管它可能因硬件而異)。 它適用於正數,因為有符號位為0 ,因此位序列相同。 但是在負數的情況下,有符號位(最左邊的位)是1 ,如果這樣的位序列被解釋為無符號 integer,它會給你一個巨大的數字。

如果您用以下示例替換您的語句:

cout << "be64toh = " << (long) be64toh(b) << std::endl;

它將 integer 重新解釋為已簽名(long 默認已簽名),然后您將能夠看到所需的結果。

因此字節序轉換沒有問題,這只是打印例程根據變量類型進行解釋的方式。

暫無
暫無

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

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