если ваша кодировка "каждое целое число действительно 8-байтовое", ваш пример неверен, потому что я вижу 4 байта (32-битного) для каждой буквы.Но в любом случае вы можете использовать fread
, когда буфер равен uint64_t (или uint32_t для случая 4 байта):
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 - используйте shift (если вам не нужен младший байт) значения uint64_t и присваивание char (например, для старшего байта
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;
}
ОБНОВЛЕНИЕ2 Также прочитайте о младшем и старшем порядковом порядке и посмотрите этот вопрос и ответ это может быть полезно в вашем случае