我正在进行这种转换是因为从网络接收到的数据是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[]
通过套接字发送无符号时出现的错误;send()
如果我使用以下初始化,我可以通过套接字(winsock)将它用作函数的适当参数。工作得很好。
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, buffer,8,0);
错误说明:
int send (SOCKET, const char *, int, int)': 无法将参数 2 从 unsigned char[8] 转换为 const char *