【问题标题】:How do I parse a char array as integer?如何将 char 数组解析为整数?
【发布时间】:2013-04-06 01:00:01
【问题描述】:

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

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

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

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

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

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

博多

【问题讨论】:

标签: c++ c arrays parsing integer


【解决方案1】:

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

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

【讨论】:

  • 但是如果buf 不是“int 对齐”呢?
【解决方案2】:

atoi。更可能是最简单的解决方法。

int iResult = atoi(buf);

【讨论】:

  • atoi() 会将“123”之类的字符串转换为值 123。它不会将字符 0x01 0x02 转换为 1x256 + 2 = 258,这就是问题所在。跨度>
【解决方案3】:

你可以使用联合:

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

【讨论】:

  • 他不要求转换,我们不知道系统是大端还是小端。如果系统是big endian,需要的函数是memcpy
  • value16[1] 的值需要为 256,但这样我得到 1,所以你还需要 ntohs。
  • 所以你拥有一个小端系统。
猜你喜欢
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
  • 2021-04-03
  • 2011-06-05
相关资源
最近更新 更多