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

jca*_*314 3 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;
Run Code Online (Sandbox Code Playgroud)

Rob*_*tin 5

忽略您returnvoid函数中调用的明显错误...

根据定义,该recv函数返回一个整数,告诉您读取的字节数(如果错误则为负数).如果要读取字节并返回它们,则需要缓冲区,而不是读取的字节数.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]);
Run Code Online (Sandbox Code Playgroud)

首先,您应该确保从上面的示例中看到"130 0 0 0"或"0 0 0 130".

现在,尝试添加:

printf("%u\n", v.whole);
Run Code Online (Sandbox Code Playgroud)

看看你是否得到130.如果你这样做,那很好.如果您反而得到2 181 038 080-33 554 432意味着您的字节顺序错误(google'endianness').您可以使用字节重新排序命令来解决此问题:

v.whole = ntohl(v.whole);
printf("%u\n", v.whole);
Run Code Online (Sandbox Code Playgroud)

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