我有一个文件,其中每个字符都表示为32位Integer值,例如,包含单词Hello
的文件包含
0000000: 4800 0000 6500 0000 6c00 0000 6c00 0000 H...e...l...l...
0000010: 6f00 0000 0000 0000 o.......
我如何才能将此文件读入字符串Hello
中,以便每个int实际上是8字节字符?当我在记事本中打开此文件时,我得到了
H e l l o // 3 spaces beween every character.
答案 0 :(得分:1)
如果您的编码是“每个int实际上是8个字节”,则您的示例是不正确的,因为我看到每个字母4个字节(32位)。
但是无论如何,当缓冲区为uint64_t时(或对于4字节的情况为uint32_t),您可以使用fread
:
uint64_t buf;
fread (&buf,sizeof(buf),1,file);
注意:此处1
是值的数量,因此您可以使用uint64_t
数组中的项目数代替1
,而使用数组名的buf
。
超过uint64
需转换为char
,在这里您可以选择从8中取任意字节:
uint64_t
和char[8]
的并集(写入uint64_t
并读取从char [0]到char [7]的任何字节)-对于uint32_t,请使用char [ 4]以及从0到3的索引 char c = (char)(buf >> 56);
)-uint32_t的高字节可以在右移24之后取,并且当然低字节不需要移位 更新
有一个从uint32_t
到char
转换的最简单示例:
#include <stdio.h>
#include <stdint.h>
union {
uint32_t i;
char c[4];
} buf32;
int main(int argc, char* argv[])
{
if (argc < 2) {
perror ("Provide argument with filename");
return 1;
}
FILE* f = fopen(argv[1],"rb");
char ch;
if (f == NULL) {
perror ("Error opening file");
return 2;
}
while (fread(&buf32.i,sizeof(buf32),1,f) == 1) {
putchar(buf32.c[0]); // prints low byte
}
fclose(f);
return 0;
}
UPDATE2 另请阅读有关大尾数的内容,请参阅this question and answer,这对您的情况很有用