如何解决如何将UINT16转换为两个带符号的字符?
我之所以执行此转换,是因为从网络中接收数据的是 unsigned char [8] 数组。每两个字节代表一个UINT16数字。我想通过套接字发送这些字节,但是套接字要求对字符进行签名(我正在使用little-endian)。
由于不可能将未签名的字符转换为已签名的字符,我想我可以从两个未签名的字符中形成一个UINT16数字,然后将数字分解为两个已签名的字符。
我的代码在UINT16的数字介于[0,127]和[256,65535]之间的情况下有效,但是当值介于[128,255]之间时,第一个字符会炸裂到〜4294967295,而UINT16现在表示为〜65535。有任何解释/解决方案吗?
uint16_t in = 129;
cout << "input is\t" << in << endl;
char lo = in & 0xFF;
char hi = in >> 8;
printf("%u",lo);
cout << "\n" << endl;
printf("%u",hi);
cout << "\n" << endl;
uint16_t out = lo | uint16_t(hi) << 8;
cout << "out is\t" << out << endl;
通过套接字发送未签名的char[]
时收到的错误;如果使用以下初始化,则可以通过套接字(winsock)将其用作send()
函数的适当参数。效果很好。
char buffer[8]
for (int i= 0; i <8; i++){
buffer[i] = 0x016; //random data
}
send(clientSocket,buffer,8,0);
但是如果按如下所示初始化缓冲区,则会出现错误:
unsigned char buffer[8]
for (int i=0; i < 8;i++){
buffer[i] = 0x016; //again random data
}
send(clientSocket,0);
错误说明:
int send(SOCKET,const char *,int,int)':无法将参数2从无符号char [8]转换为const char *
解决方法
[这是C的答案。OP尚未阐明他们对C和C ++答案的需求。]
要使用unsigned char
函数传递名为buffer
的{{1}}数组,该数组的参数类型为send
,只需将数组转换为所需的类型,就像:
const char *
在C语言中,字符类型用于处理数据的“原始字节”(以及用于编码字符,不幸的含义和用法的合并),因此您可以通过这种方式发送任何类型的数据。套接字例程不会根据任何特定类型解释数据;他们将只传输这些位,而不考虑任何签名。您可以使用不带send(socket,(const char *) buffer,length,flags);
的相同类型转换来接收数据,只要将数据写入原始来源的同一类型的对象即可。
(可能存在这样的问题,发送和接收系统对各种事物使用不同的表示形式,例如在一个字节和八个字节上使用const
类型的大字节序存储在另一字节上的小字节序存储或在另一字节或四字节上使用小字节序存储)字节在另一个或不同的填充和结构上对齐。这是与通过套接字传输原始数据无关的独立问题。
({As noted by Kaz,现代的API通常将此类参数声明为long
或void *
,并且在将其他对象指针传递给它们时不需要强制转换。如果遇到一些编译器警告消息对此,您可能正在使用过时的API。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。