Преобразовать массив целых чисел в массив символов - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть файл, в котором каждый символ представлен в виде 32-битного целочисленного значения, например, для файла, содержащего слово 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.

1 Ответ

0 голосов
/ 06 февраля 2019

если ваша кодировка "каждое целое число действительно 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 Также прочитайте о младшем и старшем порядковом порядке и посмотрите этот вопрос и ответ это может быть полезно в вашем случае

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...