2010-03-01 84 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) 
相关问题