将4个套接字字节转换为int

时间:2012-04-01 18:09:04

标签: c++ c

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

#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;

2 个答案:

答案 0 :(得分:5)

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

recv函数,definition,返回一个整数,告诉您读取的字节数(如果错误则为负数)。如果要读取字节并返回它们,则需要cout缓冲区,而不是读取的字节数。

但是,打印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,则表示您的字节顺序错误(google'endianness')。您可以使用字节重新排序命令来解决此问题:

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

ntohl重新排序字节以使字节顺序与本地计算机匹配。

答案 1 :(得分:2)

代码存在缺陷。声明该函数不返回值,但确实如此。

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