如何在File的末尾添加2字节CRC

时间:2012-03-07 08:24:21

标签: c crc

我有一个名为encrypt的加密文件。 在这里,我为此文件计算了crc 16,并将此crc结果存储在unsigned short中,此无符号短文的大小为2 byte(16 bits)。 现在我想在这个文件的末尾附加2个字节的crc值,并从文件中读取最后2个字节并且必须比较这个crc,那么我该如何实现这个呢?

我使用了这段代码

fseek(readFile, filesize, SEEK_SET);
fprintf(readFile,"%u",result);

此处filesize是我的文件原始加密文件大小,在此之后我添加result unsigned short,但在文件中写入5个字节。

此后的文件内容

testsgh
30549 

原始文件数据是testsgh但是这里crc是30459我想将这个值存储在2个字节中。那我怎么办?

4 个答案:

答案 0 :(得分:3)

您应该以二进制附加模式打开文件:

FILE *out = fopen("myfile.bin", "ab");

这将消除寻求最终的需要。

然后,您需要使用直接写入,而不是将值转换为字符串并写入字符串的打印。您想要写出unsigned short校验和的位:

const size_t wrote = fwrite(&checksum, sizeof checksum, 1, out);

当且仅当wrote的值为1时才成功。

但是,请注意,这可能会引入字节序错误,因为它使用机器的本地字节顺序写入值。为了安全起见,决定字节排序并直接实现它更清晰。对于big-endian:

const unsigned char check_bytes[2] = { checksum >> 8, checksum & 255 };
const size_t wrote = fwrite(check_bytes, sizeof check_bytes, 1, out);

同样,我们希望调用后wrote为1表示两个字节都已成功写入。

答案 1 :(得分:0)

您可以使用%c 格式编写单个字符。 e.g。

fprintf(readfile, "%c%c", result % 256, result / 256)

btw: readfile 在您写信时会产生误导: - )

答案 2 :(得分:0)

使用fwrite(),而不是fprintf。我无法访问C编译器atm而是访问fwrite(& result,sizeof(result),1,readFile);应该工作。

答案 3 :(得分:0)

你可以这样做:

unsigned char c1, c2;
c1 = (unsigned char)(result >> 8);
c2 = (unsigned char)( (result << 8) >> 8);

然后在文件末尾添加c1c2。当您回读文件时,请执行相反的操作:

result = ( (unsigned)c1 << 8 ) + (unsigned)c2;

希望有所帮助。