将整数数组转换为字符数组

时间:2019-02-06 06:05:32

标签: c file

我有一个文件,其中每个字符都表示为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.

1 个答案:

答案 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_tchar[8]的并集(写入uint64_t并读取从char [0]到char [7]的任何字节)-对于uint32_t,请使用char [ 4]以及从0到3的索引
  • 使用uint64_t值的移位(如果不需要低字节)并分配给char(例如,获取高字节char c = (char)(buf >> 56);)-uint32_t的高字节可以在右移24之后取,并且当然低字节不需要移位
  • 等(您可以发明自己的单字节方法,即字符,提取)

更新 有一个从uint32_tchar转换的最简单示例:

#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,这对您的情况很有用