我对C编程比较陌生,但还没有找到答案。 我想通过TCP连接正确地发送和接收整数,字符和长整数。 我已经建立了这个,但它还没有用。
发件人:
int a = 12345;
char b = -1;
unsigned long c = 12174723939;
unsigned char array[256];
array[0] = (a >> 0) & 0xFF;
array[1] = (a >> 8) & 0xFF;
array[2] = (b >> 16) & 0xFF; //Is this correct for -1?
array[3] = (c >> 24) & 0xFF;
array[4] = (c >> 32) & 0xFF;
array[5] = (c >> 40) & 0xFF;
array[6] = (c >> 48) & 0xFF;
send(socket, array, sizeof(array),0); //or is &array better?
接收器:
int a;
char b;
unsigned long c;
unsigned char array[256];
recv(socket, array, sizeof(array),0);
a |= (array[0] << 0) & 0xFF;
a |= (array[1] << 8) & 0xFF;
b |= (array[2] << 16) & 0xFF;
c |= (array[3] << 24) & 0xFF;
c |= (array[4] << 32) & 0xFF;
c |= (array[5] << 40) & 0xFF;
c |= (array[6] << 48) & 0xFF;
这是对的吗?缺什么?还有其他解决方案吗?
接收部分如何完成?我读过关于大端和小端的信息( htonl / htons 和 ntohl / ntosl )。有人有一个关于如何实现它的例子,例如,在这段代码中吗?
答案 0 :(得分:1)
你写的不正确。我假设您打算构建一个包含该顺序的无符号字符缓冲区:
你应该写:
array[0] = (a >> 0) & 0xFF; // lowest byte
array[1] = (a >> 8) & 0xFF; // next
array[2] = b; // cast a char to an unsigned char
array[3] = (c >> 0) & 0xFF; // lowest byte of c
array[4] = (c >> 8) & 0xFF;
array[5] = (c >> 16) & 0xFF;
array[6] = (c >> 24) & 0xFF;
你不应该发送整个缓冲区而只发送有趣的部分:7个字节:
send(socket, array, 7, 0);
在接收器部分中,您可以从字节重建值:
a = array[0]; // start with an initial value
a |= array[1] >> 8;
b = array[2]; // is already a single byte
c = array[3];
c |= array[4] >> 8;
c |= array[5] >> 16;
c |= array[6] >> 24;
注意:当您通过首先发送最低字节来明确处理字节序时,可以在使用不同字节序的机器上使用它
答案 1 :(得分:0)
在接收方,你应该按相反的顺序思考
a += array[1];
a<<=8;
a += (array[0]);
但请注意,左移符号值是UB,正如标准所说
<强> 6.5.7.4 强>
E1的结果&lt;&lt; E2是E1左移E2位位置;腾出的位充满了 零。如果E1具有无符号类型,则结果的值为E1×2E2,模数减少 比结果类型中可表示的最大值多一个。 如果E1已签名 类型和非负值,E1×2E2在结果类型中可表示,那就是 结果价值;否则,行为未定义。