gpt4 book ai didi

c - 读取 .dat 文件时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 03:51:52 25 4
gpt4 key购买 nike

现在,我正在编写示例代码,希望稍后将其集成到我的程序中。我基本上想做的是逐字节读取 .dat 文件并解释数据(即解释引导扇区以输出扇区大小、保留扇区等)

为此,我逐字节读取数据,并使用 https://www.win.tue.nl/~aeb/linux/fs/fat/fat-1.html#ss1.3 的 fat12 中的描述,我将数据翻译成我想要的信息。现在,我可以从文件中提取单个字节(假设提取的数据为十六进制是否正确?)。但是,我需要两个字节才能有意义。所以,我需要将两个字节合二为一,将十六进制数据转换成十进制并输出信息。不幸的是,现在,我遇到了段错误,对于我来说,我无法弄清楚出了什么问题。提前致谢!

int main (int argc, char **argv){

FILE *fp ,*fptest;
long lSize;
char *buffer;

//Open file
fptest= open("fat_volume.dat", "rb");

//Read file into buffer
fread(buffer,1,512,fptest);

//Parse the boot sector
char tmpA, tmpB;
tmpA = buffer[10]; //First byte
tmpB = buffer[11]; //Second byte

//Combine the two bytes into one
char combinedBytes[3];
strcpy (combinedBytes, tmpA);
strcat (combinedBytes, tmpB);

//Hex to decimal converter
long int li1;
li1 = strtol (combinedBytes,NULL,16);
printf ("The sector size is: %ld.\n", li1);

return 0;

最佳答案

你必须分配buffer;例如

char buffer[512];

char *buffer = malloc(512);

编辑:

字符串操作

strcpy (combinedBytes, tmpA);
strcat (combinedBytes, tmpB);

也没有意义并且访问/复制了太多数据(编译器会警告您!)。

我建议将值读作

unsigned char tmpA = buffer[10];
unsigned char tmpB = buffer[11];

unsigned int tmp = (tmpA << 8) | (tmpB << 0); /* or revert in in case of
little-endian */

为了让事情更有效率,我会把它写成

struct fat_header {
uint8_t pad0[10];
uint16_t my_val;
uint8_t pad1[500];
} __attribute__((__packed__)); /* this is not portable and for gcc! */

...

struct fat_header hdr;

fread(&hdr, 1, sizeof hdr, f);
uint16_t val = be16toh(hdr.my_val); /* or le16toh() in case of le */

关于c - 读取 .dat 文件时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20060246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com