四个1byte char到一个4byte int
Four 1byte char to One 4byte int?
我有一个1000字节的字符数组。我想把它转换成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.
我该怎么做呢?
对于数组中的每个字符,将其数字添加到我们正在构建的值中。(我们事先乘以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以外的字符,这将不起作用,但这是任何容易添加的检查。
为什么不使用sscanf
将数组转换为int值呢?如果您想将4个字节的char
数组转换为一个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] = ' ';
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("%dn", int_array[i]);
}
这将产生
928
1234
作为输出
哦,顺便说一下,因为你正在使用C风格的数组,我假设你也想要一个C的解决方案。否则我建议使用vector
s而不是数组。
您可以使用strncpy
只复制临时字符数组中的4个字符,然后通过atoi
将其转换为整数。
char tmp[5];
tmp[4] = ' ';
for (int i=0; i<250; i++)
{
strncpy (tmp, &char_array[i*4], 4);
int_array[i] = atoi (tmp);
}
试试下面的代码:
#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;
}
如果数组中的所有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;
then *char_array_to_int包含你想要的值
否则,您可以使用位移位将int填充为您想要的4个字节。
编辑对不起,我错过了字符数组上的引号。
那么是的,你需要从数字的ascii表示改为数字本身,正如在注释中指出的。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '