如何解析char数组作为整数?
问题描述:
我有一个char数组像这样的缓冲:如何解析char数组作为整数?
char buf[4];
buf[0] = 0x82;
buf[1] = 0x7e;
buf[2] = 0x01;
buf[3] = 0x00;
我现在想读焦炭两个和三个一起在大端16位无符号整数。我如何用C(++)标准工具来做到这一点?
目前我只知道手动解决方案:
int length = but[3];
length += but[2] << 8;
这将很容易为16Bit的整数,但我也需要解析32位整数,这会使得事情有点困难。那么是否有一个来自标准库的函数可以帮我做到这一点?
博德
答
您可以使用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;
}
或者你可以围绕交换字节,并将其转换为适当的类型,而不是转移的。
答
atoi。更可能是最简单的修复。
int iResult = atoi(buf);
+0
'atoi()'会将字符串“123”转换为值123.它不会将字符0x01 0x02转换为1x256 + 2 = 258,这就是问题所在。 –
答
您可以使用一个联盟:
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的:[η存储在字符数组的int]
memcpy(&length, buf, sizeof(length))
可能重复(http://*.com/questions/1522994/store-an-int-in-a-char-array) –
这是建议的重复问题的逆操作。 –