我有一个名为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个字节中。那我怎么办?
答案 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);
然后在文件末尾添加c1
和c2
。当您回读文件时,请执行相反的操作:
result = ( (unsigned)c1 << 8 ) + (unsigned)c2;
希望有所帮助。