将4个字节的字节转换为一个int

问题描述:

下面的代码从一个套接字读取4个字节到一个整数。我可以看到字节是(十进制)130 0 0 0.我怀疑下面的代码将返回版本130,但我不知道为什么。这会返回130吗?我试图在Java中复制它,但我是一个非常大的负数(更多我期望的)。我如何解释下面的伪/ C代码?将4个字节的字节转换为一个int

#include <socket.h> 
void readVersion(char *buf, int iCount) { 
     recv(hSocket, buf, iCount, MSG_WAITALL); 
} 
int m_iVersion; 
readVersion((char *) &m_iVersion, sizeof (m_iVersion)) 
count << m_iVersion; 
+5

我认为你真正的问题是关于_ [endianness](http://en.wikipedia.org/wiki/Endianness)_。 – ildjarn 2012-04-01 18:13:13

+5

什么是应该返回的“void”函数? – SingleNegationElimination 2012-04-01 18:13:47

+0

我强烈建议不要使用这种方式施放。检查你正在执行的协议的规范,并根据该协议解释四个字节。不要只是在演员阵容中充当一个'int',并希望最好。 – 2012-04-01 19:14:51

忽略您在void函数调用return明显的错误...

recv功能,通过definition,返回一个整数告诉你的字节数读取(或负如果误差)。如果你想读取字节并返回它们,你想要缓冲区,而不是读取的字节数。

但是,打印一个int将打印整个事情..不是像你所期望的逐字节。那样的事情呢?

int nb, i; 
union { 
    uint32_t whole; 
    char bytes[4]; 
} v; 
nb = recv(hSocket, v.bytes, 4, MSG_WAITALL); 
if (nb != 4) 
    printf("Error: recv returned: %d\n", nb); 
else 
    printf("%d %d %d %d\n", v.bytes[0], v.bytes[1], v.bytes[2], v.bytes[3]); 

首先,你应该确保你从上面的例子中看到 “130 0 0 0” 或 “0 0 0 130”。

现在,试着加入:

printf("%u\n", v.whole); 

,看看你得到130如果你这样做,太好了。如果你得到2 181 038 080-33 554 432这意味着你的字节顺序错误(谷歌'排序')。你可以用一个字节重新排序命令解决这个问题:

v.whole = ntohl(v.whole); 
printf("%u\n", v.whole); 

ntohl重新排序的字节,使字节顺序匹配您的本地计算机。

代码有缺陷。该函数被声明为不返回值,但它确实。

recv返回读取的字节数,所以它会打印4,整数读取将存储在m_iVersion。整数是130还是大数取决于计算机的字节顺序。