如何解析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位整数,这会使得事情有点困难。那么是否有一个来自标准库的函数可以帮我做到这一点?

博德

+0

可能重复(http://*.com/questions/1522994/store-an-int-in-a-char-array) –

+0

这是建议的重复问题的逆操作。 –

您可以使用ntohsntohl(在小端系统):

#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; 
} 

或者你可以围绕交换字节,并将其转换为适当的类型,而不是转移的。

+0

但是如果'buf'不是“int aligned”呢? – BenjaminB

+0

谢谢,已更新 – perreal

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)) 
+0

他没有要求转换,我们不知道系统是大还是小端。如果系统是大端,所需的功能是memcpy – BenjaminB

+0

我添加了一个短阵列。 – BenjaminB

+0

'value16 [1]'的值需要是256,但是我得到1,所以你还需要ntohs。 – perreal