从二进制文件中读取6字节8位整数
Reading 6 byte 8-bit integer from binary file
我的文件是这样的:
00 00 00 00 00 34 ....
我已经使用fread
将其读取到unsigned char
数组,但我不知道,我现在如何将其变成unsigned integer
。数组看起来像这样:
0, 0, 0, 0, 0, 52
我是这样让它工作的:
unsigned char table_index[6];
fread(table_index, 1, 6, file);
unsigned long long tindex = 0;
tindex = (tindex << 8);
tindex = (tindex << 8);
tindex = (tindex << 8) + table_index[0];
tindex = (tindex << 8) + table_index[1];
tindex = (tindex << 8) + table_index[2];
tindex = (tindex << 8) + table_index[3];
tindex = (tindex << 8) + table_index[4];
tindex = (tindex << 8) + table_index[5];
您从48位值开始,但是您的系统上可能没有48位整数类型。可能有64位类型,可能是"long - long"。
假设您的6个字节是按最重要的顺序排列的,并且了解您需要为long long填充两个额外的字节,您可以这样做:
long long myNumber;
char *ptr = (char *)&myNumber;
*ptr++ = 0; // pad the msb
*ptr++ = 0; // pad the 2nd msb
fread(ptr, 1, 6, fp);
现在你得到了myNumber
如果文件由48位整数填充,就像我假设你正在谈论的那样,从char数组中,你可以这样做:
char temp[8];
unsigned char *data = //...
unsigned char *data_ptr = data;
vector<unsigned long long> numbers;
size_t sz = // Num of 48-bit numbers
for (size_t i = 0; i < sz; i++, data_ptr += 6)
{
memcpy(temp + 2, data_ptr, 6);
numbers.push_back((unsigned long long)*temp);
}
这个算法假设所有的数字都已经在文件中被正确编码。它还假定了一种我无法立即命名的顺序。
如果您想将uchar数组的4个字节解释为一个int,请执行以下操作:
unsigned char uchararray[totalsize];
unsigned int * uintarray = (unsigned int *)uchararray;
如果你想将你的uchar数组中的一个字节转换为一个int,执行以下命令:
unsigned char uchararray[totalsize];
unsigned int uintarray[totalsize];
for(int i = 0 ; i < totalsize; i++)
uintarray[i] = (unsigned int)uchararray[i];
这就是你说的吗?
// long long because it's usually 8 bytes (and there's not usually a 6 byte int type)
vector<unsigned long long> numbers;
fstream infile("testfile.txt");
if (!infile) {
cout << "fail" << endl;
cin.get();
return 0;
}
while (true) {
stringstream numstr;
string tmp;
unsigned long long num;
for (int i = 0; i < 6 && infile >> tmp; ++i)
numstr << hex << tmp;
if (cin.bad())
break;
cout << numstr.str() << endl;
numstr >> num;
numbers.push_back(num);
}
我用你给的输入(00 00 23 51 A4 D2
)测试了它,向量的内容是592553170
。
相关文章:
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 从两个 4x64 位整数数组中获取取模
- 在 c++ 中输出 64 位整数
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 在 64 位整数内旋转(90°)位矩阵(最多 8x8 位)
- 如何通过COM接口将64位整数从C++发送到C#
- GMP-将64位整数存储在mpz_t/mpz_class中,并返回64位整数
- 将74位整数转换为以31为底的整数
- 如何创建128位整数文本
- 如何忽略32位整数中的特定位
- int64_t 不包含 13 位整数
- MongoDB C++ 驱动程序 - 8 位和 16 位整数?
- 检测 32 位整数溢出
- 将 64 位整数中的每个其他位与 32 位整数进行比较
- 按段比较 64 位整数
- 对 32 位整数进行哈希处理比对 3 个 16 位整数的哈希进行按位运算慢?
- 将 2 位整数分配给 char 变量
- SSE 整数 2^n 的 2 次方,对于没有 AVX2 的 32 位整数
- 32 位整数缩放,无溢出
- 在C 中旋转每3位整数