2012-02-14 105 views
1
// Works 
    int fnamesize=0; 
    fnamesize=message[0]<<24; 
    fnamesize+=message[1]<<16; 
    fnamesize+=message[2]<<8; 
    fnamesize+=message[3]; 

    // Doesn't work 
    int fsize; 
    memcpy(&fsize,message,sizeof(int)); 

有人可以解释为什么第二个不起作用吗?我从复制的内存是char *。当我尝试测试fnamesize和fsize的值时,如printf("fsize is %d,fnamesize is %d",fsize,fnamesize);,fsize会给出意想不到的值,但fnamesize会给出我期望的值。C:从字符数组复制到int

想法?

回答

3

这是因为endianess,这意味着int中字节的布局。

在Windows中,第二种方法会给你有相反的字节顺序一个int,像这样:

fsize=message[3]<<24; 
fsize+=message[2]<<16; 
fsize+=message[1]<<8; 
fsize+=message[0]; 
+0

绝对正确。编写一个“网络堆栈模拟器”,并且部分项目正在使用ntoh_和hton_。感谢您让我走向正确的方向! – Joseph 2012-02-14 03:59:47

+0

很高兴我能帮忙:) – MByD 2012-02-14 04:00:41

1

试着改变你的代码,工程数组索引的顺序,比较结果该代码不起作用,并查找术语“大端”和“小端”。