我需要一些关于我必须为学校创建的计划的帮助。我不确切知道如何从bin文件中读取和操作数据。 bin文件采用TCP头的形式,我需要:
这是我到目前为止所做的:
struct tcp
{
unsigned char sourceport[2];
unsigned char destination[2];
unsigned char sequence[4];
unsigned char ackno[4];
unsigned char other[2];
unsigned char window[2];
unsigned char checksum[2];
unsigned char urgent[2];
} my_header;
int readfile(char filename[])
{
FILE *fp;
int pointer, i;
unsigned char buffer[20];
fp = fopen(filename, "r");
if(!fp){ return 1; }
fread(&my_header, sizeof(my_header), 1, fp);
i = 0;
pointer = 0;
while (pointer < 2)
{
my_header.sourceport[pointer] = buffer[pointer];
pointer++;
}
while (pointer < 4)
{
my_header.destination[pointer - 2] = buffer[pointer];
pointer++;
}
while(pointer < 8)
{
my_header.sequence[pointer - 4] = buffer[pointer];
pointer++;
}
while(pointer < 12)
{
my_header.ackno[pointer - 8] = buffer[pointer];
pointer++;
}
while(pointer < 14)
{
my_header.other[pointer - 12] = buffer[pointer];
pointer++;
}
while(pointer < 16)
{
my_header.window[pointer - 14] = buffer[pointer];
pointer++;
}
while(pointer < 18)
{
my_header.checksum[pointer - 16] = buffer[pointer];
pointer++;
}
while(pointer < 20)
{
my_header.urgent[pointer - 18] = buffer[pointer];
pointer++;
}
fclose(fp);
return 0;
}
int main(int argc, char* argv)
{
int check;
unsigned char swap[2];
check = readfile("test.bin");
/* Checking for file to read */
if(check == 0)
{
printf("File successfully read\n");
}
/* If file is not found */
if(check == 1)
{
printf("Cannot open/find file.\n");
}
strcpy(swap,my_header.sourceport);
strcpy(my_header.sourceport, my_header.destination);
strcpy(my_header.destination, swap);
writefile("test.bin");
return 0;
}
答案 0 :(得分:0)
您的readfile
功能存在多个问题。
主要问题是你在缓冲区中取值(未分配)并将这些垃圾值写入struct字段。您传递的地址为my_header
,而不是buffer
。
此外,您没有检查fread()
的返回值,因此您不知道调用是否失败或者是否返回了足够的字节数。
事实证明,直接阅读my_header
实际上是处理此问题的首选方法。假设读取成功并且struct字段的大小和文件内容的顺序相同,则不需要执行任何其他操作。该结构已经填充。
所以你的功能应该是这样的:
int readfile(char filename[])
{
FILE *fp;
int bytes_read;
fp = fopen(filename, "r");
if (!fp) {
perror("fopen failed");
return 1;
}
bytes_read = fread(&my_header, sizeof(my_header), 1, fp);
if (bytes_read == -1) {
perror("fread failed");
fclose(fp);
return 1;
} else if (bytes_read != sizeof(my_header)) {
fprintf(stderr, "expected to read %d bytes, actually read %d\n", sizeof(my_header), bytes_read);
fclose(fp);
return 1;
}
fclose(fp);
return 0;
}
请注意使用perror
打印fopen
和fread
的详细错误消息,并确保在文件打开后在错误情况下调用fclose(fp)
。< / p>
编辑:
struct包含char数组,但它们不是字符串而是字节数组,所以你不能在它们上使用strcpy
或其他字符串操作函数。但是,您可以使用memcpy
:
memcpy(swap,my_header.sourceport, 2);
memcpy(my_header.sourceport, my_header.destination, 2);
memcpy(my_header.destination, swap, 2);