2010-03-01 85 views
5

我總是被教導,如果一個整數大於一個字符,你必須解決字節排序問題。通常情況下,我將它包裝在hton [l | s]中,並用ntoh [l | s]將其轉換回來。但我很困惑,爲什麼這不適用於單字節字符。網絡字節順序轉換與「字符」

我很想知道爲什麼會這樣,並且會喜歡經驗豐富的網絡程序員來幫助我瞭解字節排序只適用於多字節整數的原因。

編號:http://beej.us/guide/bgnet/output/html/multipage/htonsman.html

+1

欣賞的答案,有那些「do'h 「時刻! – Rev316 2010-03-01 19:56:38

回答

19

你在找什麼是endianness

大端架構存儲字節的多字節數據類型的,像這樣:

big-endian

而小端架構將它們存儲在反向:

little-endian

當數據從一臺機器傳輸到另一臺機器,單個數據類型的字節必須重新排序以符合目標機器的字節順序。

但是,當數據類型只包含一個字節,沒有什麼可以重新訂購

+0

+1,但您可能需要重新考慮盜取其他網站的帶寬。 – Bill 2010-03-01 18:48:21

+1

@Bill,維基百科關於盜鏈的政策在http://commons.wikimedia.org/wiki/Commons:Reusing_content_outside_Wikimedia#Hotlinking - 但wikimedia.org在這裏被封鎖,所以我自己看不懂。你會介意解釋嗎?謝謝! – 2010-03-01 18:52:39

+1

今天我學到了一些新東西,謝謝!熱鏈接轉述:「去它,但圖像可能會改變,警戒者腳本。」有關阻塞的消息。 – Bill 2010-03-01 19:41:45

4

你的網絡協議棧,將正確處理字節內位,必須只得到字節以正確的順序關心自己。

2

您不會讀取線上的單個位,只是字節。無論字節順序如何,單個字節是相同的反向和前向,就像單詞「I」是相同的反向和前向一樣。

+0

許多以太網系統都會對單個位進行編碼 - 參見http://en.wikipedia.org/wiki/MLT-3,儘管更快的是半字節。 – 2010-03-01 17:50:02

4

究竟有多少種方法可以在單個字符中排序字節?

+2

snark +1。按照C和C++的定義,char是最小的可尋址存儲單元。 snark的 – 2010-03-01 17:50:40

+3

-1。你知道OP沒有的問題的答案。對你有好處。不要對此表示不滿。 – 2010-03-01 20:49:54

+0

放鬆 - OP顯然知道字節排序和hton等 - 爲什麼你不需要這個字節只是這些d的時刻之一。 – 2010-03-02 00:52:45

3

您需要考慮每個函數的功能。從那以後,你需要將這些知識應用到你打算修改的類型的大小。考慮以下幾點:

#include <stdio.h> 
#include <netinet/in.h> 

int main() { 
    uint16_t i = 42; 
    uint8_t c = 42; // a char 
    printf ("(uint16_t) %08X (%d)\n", i, i); 
    printf ("( htons) %08X (%d)\n", htons(i), htons(i)); 
    printf ("(uint8_t) %08X (%c)\n", c, c); 
    printf ("( htons) %08X (%c)\n", htons(c), htons(c)); 
    return 0; 
} 

(uint16_t) 0000002A (42) 
( htons) 00002A00 (10752) 
(uint8_t) 0000002A (*) 
( htons) 00002A00() 
0

除了人們已經把它的所有其他方面:字節順序是關於字節的整數的順序,不是位的字節順序。即使在大端和小端機器中,字節中的位順序也是相同的。唯一的區別是字節本身用於存儲整數的順序(或者是短或者是什麼)。所以,因爲char中只有一個字節,所以無論是在大端還是小端架構中,存儲值都沒有區別。

+0

即使我對它進行計算,如按位或加法*(signed char)*?這用於將整數中包含的Unicode代碼點轉換爲ᴜᴛꜰ-8。 – user2284570 2015-08-31 21:05:49

0

EZPZ代碼不正確..

uint16_t i = 65534; 
printf ("(uint16_t) %08X (%d)\n", i, i); 

Returns... 
(uint16_t) 0000FFFE (-2) 

你應該用一個unsigned int類型代替它不會被解釋爲有符號整數

uint16_t i = 65534; 
printf ("(uint16_t) %08X (%u)\n", i, i); 

Returns... 
(uint16_t) 0000FFFE (65534) 
相關問題