如何将字符数组解析为整数

How do I parse a char array as integer?

本文关键字:整数 数组 字符      更新时间:2023-10-16

我有一个像这样的缓冲区char数组:

char buf[4];
buf[0] = 0x82;
buf[1] = 0x7e;
buf[2] = 0x01;
buf[3] = 0x00;

我现在想读char 2和3一起作为一个16位无符号整数在大端。如何使用C(++)标准工具做到这一点?

目前我只知道手动解决方案:

int length = but[3];
length += but[2] << 8;

这对于16位整数来说很容易,但我还需要解析32位整数,这会使事情变得有点困难。有没有一个标准库中的函数可以帮我做这个?

博多

您可以使用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;
}

或者您可以交换字节并将其转换为适当的类型,而不是移动

您可以使用联合:

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

很可能是最简单的修复方法。

int iResult = atoi(buf);