将 FILE 中的二进制字节值存储到 C 数组中

Posted

技术标签:

【中文标题】将 FILE 中的二进制字节值存储到 C 数组中【英文标题】:Store binary byte values from a FILE into C array 【发布时间】:2013-12-10 16:40:17 【问题描述】:

我有一个带有 hexadecimals 二进制值的文件,我想要的是读取这些值 2 by 2 byte by byte 并存储它们成一个数组。我的意思是:

我有一个文件(这不是一个 ascii 字符串,我需要一个 HEX 编辑器来打开这个文件)

00B011070000FF

而我想要的是:

 ITA[0] = 00;
 ITA[1] = B0;
 ITA[2] = 11;
 ITA[3] = 07;
 ITA[4] = 00;
 ITA[5] = 00;
 ITA[6] = FF;

ITA 是unsigned int

我该怎么做?

提前致谢。

解决方案:

    FILE *pFile = fopen("/ita/hex", "r");

    if (!pFile) 
            printf("Error abriendo archivo\n");
        

    fseek(pFile, 0, SEEK_END);
    int size = ftell(pFile);
    fseek(pFile, 0, SEEK_SET);
    printf("%i\n",size);
    unsigned int ITA[size];
    for (i = 0; i < size; i++) 
        char value;
        fread(&value, 1, 1, pFile);
        ITA[i] = (unsigned int) value;
    
    fclose(pFile);
    printf(" ITA is : %X", crcFast2(ITA, size));// crcFAST2 calculates the crc of the hexadecimals

再次感谢您!

【问题讨论】:

文件内容是二进制还是ASCII,即0x00…还是“00…”? 二进制,我的意思是 00B011070000FF 是一个十六进制值。 (0x00B011070000FF) 问题是:文件中是否包含00B011...等字符。还是第一个文件的字节 0x00,第二个字节 0xB0,第三个字节 0x11,等等?你想读入的数组类型是什么? 我尝试了不同的方式...您可以使用普通文本编辑器阅读内容还是需要使用十六进制编辑器才能查看值? 噢...我需要一个 HEX 编辑器,而 ITA 是一个无符号整数数组 【参考方案1】:

由于文件包含二进制数据且ITAunsigned int 数组:

#include <stdio.h>

void readBinary(char *const filename, unsigned int *const ITA, const int size) 
    FILE *pFile = fopen(filename, "r");
    for (int i = 0; i < size; i++) 
        char value;
        fread(&value, 1, 1, pFile);
        ITA[i] = (unsigned int) value;
    
    fclose(pFile);

在您描述的场景中,参数size 应该是7

【讨论】:

为清楚起见,添加ITA 的必要定义会很好(因为它与 OP 不同)。【参考方案2】:

如果它是二进制文件,那么你可以直接将文件 mmap() 到内存中

请参阅this page 了解我在哪里无耻地窃取了以下代码

#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>

int fd, pagesize;
unsigned char *data; /* NB note char array not unsigned int as requested */

fd = open("foo", O_RDONLY);
pagesize = getpagesize();
data = mmap((caddr_t)0, pagesize, PROT_READ, MAP_SHARED, fd, pagesize);

请注意,八位位组数据将被打包到一个字符数组中,这是存储八位位组数据的优选方式,但不是所请求的

还有这个:http://www.gnu.org/software/libc/manual/html_node/Memory_002dmapped-I_002fO.html

【讨论】:

你可以,但这会产生 char * 而不是 unsigned int * 所要求的。 错过了!您几乎肯定不应该强制转换整个数组/指针,尽管它可能会起作用,但应该在访问数组时强制转换数组中的每个值;例如(unsigned int)ITA[i] 这可能是也可能不是问题,具体取决于应用程序。解决方案中的字符也应该是无符号的 不,那也行不通。投射的 unsigned int * 的重叠不仅会给出错误的数据。在某些平台(例如 arm)上,未对齐的访问是总线错误。强制转换不是答案,数据必须从文件的打包形式复制到请求者要求的每 4 个形式使用的稀疏 1 个字节。 mmap() 七个字节对我来说似乎有点矫枉过正。 是的,很公平,我已经编辑了答案以明确它不符合要求

以上是关于将 FILE 中的二进制字节值存储到 C 数组中的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中将 int 转换为 2 字节的十六进制值

C# 和 Java 中的十六进制到字节数组给出不同的结果

python中的十六进制字符串到字节数组

[C++11]_[初级]_[十六进制字符串转换为字节数组]

在java中如何把字节数组存储到数据库?

是否可以将字符串转换为二进制表示的字节数组