【问题标题】:Four 1byte char to One 4byte int? [closed]四个 1byte char 到一个 4byte int? [关闭]
【发布时间】:2017-03-31 22:55:25
【问题描述】:

我有一个 1000 字节的 char 数组。我想将其转换为 int 数组,使得 char 数组的四个元素(每个一个字节)等于一个 int 数组的元素(每个四个字节)。

e.g.:
char_array[0] = '0'
char_array[1] = '9'
char_array[2] = '2'
char_array[3] = '8'

it should be converted to
int_array[0] = 928 or 0928.

我该怎么做?

【问题讨论】:

  • 您想将字符转换为数字还是将字节转换为整数?您的示例代码提示前者,您的第一段提示后者。也许你只需要atoi
  • 可能有很多答案。你能把更具体的代码吗?
  • n = 1000*0 + 100*9 + 2*10 + 1*8: 显示你尝试过的内容。

标签: c++ c char int type-conversion


【解决方案1】:

如果您的所有 char 组件在数组中都是连续的,那么只需将第一个地址转换为 int * 就很简单了:

char_array[0] = '0'
char_array[1] = '9'
char_array[2] = '2'
char_array[3] = '8'

int * char_array_to_int = (int *)char_array;

那么 *char_array_to_int 包含你想要的值。

否则,您可以使用位移来用您想要的 4 个字节填充 int。

编辑

对不起,我错过了 char 数组中的引号。

那么是的,您需要从数字的 ascii 表示更改为 cmets 中指出的数字本身。

【讨论】:

  • 你的答案不起作用,你不能像那样将字符转换为数字。结果取决于您的字节序
  • 无论如何都会调用未定义的行为。
【解决方案2】:

为什么不使用sscanf 将数组转换为int 值。如果您想将 char 数组的 4 个字节转换为一个 int,那么只需将数组拆分为 4 个字节块并逐个扫描它们,如下所示:

#include <stdio.h>
#include <string.h>

int main()
{
    char char_array[8] = {'0', '9', '2', '8', '1', '2', '3', '4'};
    int array_size = sizeof(char_array) / sizeof(char_array[0]);

    int sizeof_int = sizeof(int);
    int int_array[array_size / sizeof_int];

    char buf[sizeof_int + 1];
    for (int i = 0; i < array_size; i += sizeof_int)
    {
        memcpy(buf, char_array + i, sizeof_int);
        buf[sizeof_int] = '\0';
        int val = 0;
        if (sscanf(buf, "%d", &val) == -1)
          return -1; // return in case scanf returns an error
        int_array[i / sizeof_int] = val;
    }

    for (int i = 0; i < array_size / sizeof_int; i++)
      printf("%d\n", int_array[i]);
}

这会产生

928
1234

作为输出。


哦,顺便说一句,由于您使用的是 C 样式数组,我假设您也需要 C 解决方案。否则我建议使用vectors 而不是数组。

【讨论】:

  • 不能使用 scanf,因为我没有接受用户的输入。另外,我正在研究 ARM 架构,所以有一些限制,不能使用向量 :)
  • 从字符串缓冲区读取是Sscanf, "string scanf",所以它不会从stdin 读取。只需将四个chars 复制到一个新缓冲区中,在它们后面添加一个'\0' 使其成为有效字符串,然后尝试像数字一样读取字符串并将其存储在新数组中
【解决方案3】:

您可以使用strncpy将4个字符只复制到一个临时字符数组中,然后通过atoi将其转换为整数。

char tmp[5];
tmp[4] = '\0';
for (int i=0; i<250; i++)
  {
    strncpy (tmp, &char_array[i*4], 4);
    int_array[i] = atoi (tmp);
  }

【讨论】:

  • 这会调用未定义的行为。
  • 它仍然调用 UB。 atoi 从 C 风格的字符串中读取,这是一个以 '\0' 结尾的字符数组。由于您的数组是 4 字节长并且您将 4 字节复制到其中,因此无法保证字符串正确终止,并且 atoi 将逐字扫描整个内存,直到找到 '\0'
  • @muXXmit2X 你是对的。已编辑。
【解决方案4】:

试试下面的代码:

#include<iostream>
#include<cstring>

using namespace std;

#define CHAR_ARRAY_SIZE 8

int main()
{
    char charArray[CHAR_ARRAY_SIZE] = {'1', '2', '3', '4', '5', '6', '7', '8'};

    int intArray[2];
    for(int i = 0; i < CHAR_ARRAY_SIZE/4; i++) {
        char ch1 = (charArray[4*i+0] - '0');
        char ch2 = (charArray[4*i+1] - '0');
        char ch3 = (charArray[4*i+2] - '0');
        char ch4 = (charArray[4*i+3] - '0');

        intArray[i] = ch1*1000 + ch2*100 + ch3*10 + ch4;
    }
    cout << "intArray[0] : " << intArray[0] << endl;
    cout << "intArray[1] : " << intArray[1] << endl;

    return 0;
}

【讨论】:

    【解决方案5】:

    对于数组中的每个字符,将数字添加到我们正在构建的值中。 (我们事先乘以 10 来调整数字)。

    每 4 位,添加到整数数组并重置值。

    int value = 0;
    for (i = 0; i < 1000; i++){
       value *= 10;
       value += char_array[i] - '0'
       if(i % 4 == 3){
          int_array[i/4] = value;
          value = 0;
       }
    }
    

    请注意,如果 char_array 包含数字 0-9 以外的字符,这将不起作用,但这很容易添加检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      • 2014-11-08
      相关资源
      最近更新 更多