我有像char数组这样的缓冲区:
char buf[4];
buf[0] = 0x82;
buf[1] = 0x7e;
buf[2] = 0x01;
buf[3] = 0x00;
我现在想将char 2和3一起读作big endian中的16Bit无符号整数。如何使用C(++)标准工具执行此操作?
目前我只知道手动解决方案:
int length = but[3];
length += but[2] << 8;
这对16Bit整数来说很容易,但我还需要解析32Bit整数,这会让事情变得有点困难。那么标准库中有一个函数可以帮我吗?
博多
答案 0 :(得分:6)
您可以使用ntohs
和ntohl
(在小端系统上):
#include <iostream>
#include <cstring>
#include <arpa/inet.h>
int main(){
char buf[4];
buf[0] = 0x82;
buf[1] = 0x7e;
buf[2] = 0x01;
buf[3] = 0x00;
uint16_t raw16;
uint32_t raw32;
memcpy(&raw16, buf + 2, 2);
memcpy(&raw32, buf , 4);
uint16_t len16 = ntohs(raw16);
uint32_t len32 = ntohl(raw32);
std::cout << len16 << std::endl;
std::cout << len32 << std::endl;
return 0;
}
或者您可以交换字节并将其转换为适当的类型而不是移位。
答案 1 :(得分:0)
您可以使用联合:
union conv {
char arr[4];
short value16[2];
int value32;
};
conv tmp;
tmp.arr[0] = buf[0];
tmp.arr[1] = buf[1];
tmp.arr[2] = buf[2];
tmp.arr[3] = buf[3];
或memcpy:
memcpy(&length, buf, sizeof(length))
答案 2 :(得分:-2)
atoi。很可能是最简单的解决办法。
int iResult = atoi(buf);