2011-12-03 25 views
2

如果我想通過網絡傳輸帶符號的長整型(32位整數),我該怎麼做?如果我在另一端以很長的簽名發送,我將不知道(可能)遠程機器如何表示簽名數字?那麼我該怎麼做?爲什麼沒有套接字ntol來簽名long?

+0

告訴他們如何解釋它。的[符號整數網絡和主機轉換] –

+0

可能重複(http://stackoverflow.com/questions/4878781/signed-integer-network-and-host-conversion) – outis

回答

2

因爲ntohl()運行在字節順序的,所以也沒有在意的跡象,一切關心是多少位在那裏。以標題回答問題。

要回答這個問題:「我該怎麼辦?」除了指出你提出的問題之外 - 你將它轉換爲無符號的,然後再轉換回另一個符號,因爲除了不知道它是否已簽名,任意遙控器也不知道這個號碼是關於什麼以及你的特定遠程可能對這件事更瞭解。

+0

行,所以我想我可以送的是隻要我將它標記爲在另一端簽署,我將做必要的事情來轉換回來。 –

+0

如果編譯器堅持,你可以在執行'htonl'之前將它強制轉換爲'unit32_t',然後在通過'ntohl'處理時對其進行簽名。 –

1

如果兩個系統使用負整數不同的表示(例如二進制補碼,符號 - 量值),然後發送號碼爲字符串,並將其解析爲接收器上的整數。效率不高,但除非您傳輸大量數字,否則無關緊要。如果有很多數字要傳輸,則可以使用某種形式的壓縮。

另外,定義自己的網絡表示爲負數,寫自己的ntohslhtonsl

在任一種方法,將存在不能在其他被表示每個系統上的一個號碼;您需要決定接收此號碼時適當的行動方案。

+0

根據POSIX,整數類型'intN_t'必須是二進制補碼。 'ntohl'函數是POSIX的一部分。 –

+0

@DietrichEpp:ISO C也要求它們是二進制補碼,並且最大負值是有效的(而不是陷阱)。 –

+0

將整數轉換爲字符串並再次返回聽起來像是一個非常低效的前進方向。 –

6

只需使用ntohlhtonl和鑄造或隱式轉換來回uint32_tint32_t之間。

相關問題