2009-02-08 56 views
8
大字符数组

嘿,伙计们,从C /网络新手的问题...字节顺序在C

我在做一些C套接字编程,并试图用字节顺序问题搏斗。我的请求(发送)没问题,但是当我收到数据时,我的字节全部没有了。我从这样的事情开始......

char * aResponse= (char *)malloc(512); 
int total = recv(sock, aResponse, 511, 0); 

当处理这个响应时,每个16位字似乎有它的字节反转(我使用UDP)。我试图解决这个问题做这样的事情...

unsigned short * _netOrder= (unsigned short *)aResponse; 
    unsigned short * newhostOrder= (unsigned short *)malloc(total); 
    for (i = 0; i < total; ++i) 
    { 
     newhostOrder[i] = ntohs(_netOrder[i]); 
    } 

,当我处理的数据作为短此工作正常,但是如果我投的指针为char再次字节被逆转。我究竟做错了什么?

谢谢!

回答

10

好,似乎与你正在做的两个不同水平上有什么问题。这里的一部分混乱似乎是因为你使用了指针,它们指向什么类型的对象,然后解释了指针指向的内存中值的编码。

内存中多字节实体的编码称为字节序。这两种常见的编码被称为Little Endian(LE)和Big Endian(BE)。对于LE,一个16位数量的数据如短码,首先编码最低有效字节(LSB)。在BE下,最重要的字节(MSB)首先被编码。按照惯例,网络协议通常将东西编码成我们所谓的“网络字节顺序”(NBO),它也恰好与BE相同。如果您在大端平台上发送和接收内存缓冲区,则不会遇到转换问题。但是,您的代码将依赖于BE约定的平台。如果你想编写在LE和BE平台上都能正常工作的可移植代码,你就不应该假设平台的字节顺序。

实现端便携性例程的像ntohs和()再用ntohl()htons(),和htonl()目的。从主机顺序到网络的顺序(发送)转换短值 -

  • htons():这些功能/宏给定平台在发送端和接收端做必要的转换上定义
  • htonl() - 从主机顺序到网络的顺序(发送)转换长值
  • ntohs和() - 精读从网络为了举办顺序(后收到)
  • 再用ntohl()场短值 - 从网络为了举办顺序(后收到)

了解转换长期价值,你的有关访问评论内存转换回字符时不会影响内存中实体的实际顺序。也就是说,如果您以一系列字节的形式访问缓冲区,则无论您是使用BE还是LE机器,您都可以按照实际编码的内容顺序查看字节。所以,如果你在收到NBO编码后的缓冲区,MSB将是第一个 - 永远。如果您在转换回主机顺序后查看输出缓冲区,如果您有BE机器,则字节顺序将保持不变。相反,在LE机器上,字节将全部在转换后的缓冲器中反转。

最后,在您的转换循环中,变量total引用字节。但是,您正在访问缓冲区为shorts。您的环路保护不应该是total,而应该是:

total/sizeof(unsigned short)

占各short的双字节性质。

0

网络字节顺序是大端,所以你需要将它转换成小端,如果你想它是有道理的,但如果它只是一个数组,它不应该大惊小怪,发送者如何发送它数据?

+0

不,如果你希望你的程序是可移植的(OP甚至没有说他的平台是什么),否则不要转换成小端,转换为主机本地顺序。这正是ntohs()和ntohl()的用处。 – bortzmeyer 2009-02-08 17:18:28

3

这工作正常,当我将数据视为短,但是如果我再次将指针指向一个字符的字节反转。

这就是我所期望的。

我在做什么错?

您必须知道发件人发送了什么:知道数据是字节(不需要反向)或短或长(可以)。

Google与ntohs,htonshtons API相关的教程。

2

不清楚aResponse代表什么(字符串?struct?)。 Endianness仅适用于数值,不适用于char s。您还需要确保在发件人一方,所有数值都从主机转换为网络字节顺序(hton*)。

1

除了你原来的问题(我认为已经回答),你应该看看你的malloc声明。 malloc分配字节,而一个无符号的short最可能是两个字节。

你的语句应该是这样的:

unsigned short *ptr = (unsigned short*) malloc(total * sizeof(unsigned short)); 
+0

不,总数已经以字节为单位进行计算,所以不需要乘以2.但是,OP应该从0到total/2,而不是从0到total。 – 2009-02-08 17:23:10

0

对于单个字节,我们可能不关心字节排序。