简体   繁体   English

Windows和Linux中二进制文件的C库校验和

[英]C Library checksum for binary file in windows and linux

I'm using CRC library for checksum, for text file the result same in windows and linux, but for binary file the result different. 我将CRC库用于校验和,在Windows和Linux中,文本文件的结果相同,但是对于二进制文件,结果则不同。

I'm using mingw for compiler my c program in windows, checksum result different. 我在Windows中使用mingw编译我的c程序,校验和结果不同。 is there a way checksum result same between windows and linux using CRC library? 使用CRC库,Windows和Linux之间是否有相同的校验和结果的方法?

Adding code : 添加代码:

I using this code for checksum file, found it from some web googling. 我将这段代码用于校验和文件,是通过一些Google谷歌搜索找到的。 (forgot to save the link). (忘记保存链接)。

crc32.c crc32.c

#include <sys/types.h>  
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>

#define CRC(crc, ch)     (crc = (crc >> 8) ^ crctabb[(crc ^ (ch)) & 0xff])

static const uint32_t crctabb[256] = {
    0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
    0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
    0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
    0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
    0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
    0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
    0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
    0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
    0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
    0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
    0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
    0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
    0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
    0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
    0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
    0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
    0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
    0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
    0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
    0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
    0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
    0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
    0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
    0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
    0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
    0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
    0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
    0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
    0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
    0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
    0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
    0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
    0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
    0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
    0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
    0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
    0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
    0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
    0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
    0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
    0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
    0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
    0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
    0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
    0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
    0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
    0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
    0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
    0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
    0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
    0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
    0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
    0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
    0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
    0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
    0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
    0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
    0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
    0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
    0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
    0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
    0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
    0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
    0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
};

uint32_t crc32_total = 0;

int crc32(int fd, uint32_t *cval, off_t *clen)
{
    uint32_t lcrc = ~0;
    int nr ;
    off_t len ;
    char buf[BUFSIZ], *p ;

    len = 0 ;
    crc32_total = ~crc32_total ;
    while ((nr = read(fd, buf, sizeof(buf))) > 0)
        for (len += nr, p = buf; nr--; ++p) {
        CRC(lcrc, *p) ;
        CRC(crc32_total, *p) ;
    }
    if (nr < 0)
        return 1 ;

    *clen = len ;
    *cval = ~lcrc ;
    crc32_total = ~crc32_total ;
    return 0 ;
}

checksum.c checksum.c

#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include "crc32.c"

int main (int argc,char *argv[]){
        uint32_t val;
        int ch, fd;
        off_t len;
        int (*cfncn)(int, uint32_t *, off_t *);

        cfncn = crc32;
        fd = STDIN_FILENO;
        if ((fd = open(argv[1], O_RDONLY, 0)) < 0) {
        }
        if (cfncn(fd, &val, &len)) {
        }
        printf("%d\n",val);
}

I run this code checksum binary file Windows result 10992 Linux result 1663 我运行此代码校验和二进制文件Windows结果10992 Linux结果1663

In Windows, you must open the file in binary mode by adding the _O_BINARY flag: 在Windows中, 必须通过添加_O_BINARY标志以二进制模式打开文件:

fd = open(argv[1], O_RDONLY | _O_BINARY, 0)

If you don't, the C++ runtime will perform translations on the contents of the file as it's read in. The most obvious result will be to remove all the \\r characters from the input, but an even greater danger is that it will signal end-of-file when it reads \\x1a and you'll stop prematurely. 否则,C ++运行时将在读入文件时对文件内容执行翻译。最明显的结果是从输入中删除所有\\r字符,但更大的危险是它将发出信号文件结尾,当它读取\\x1a ,您将过早停止。 The first is an attempt to normalize the line-endings between text files on the *nix systems where C was first developed (which uses \\n by itself), and text files on Windows (which uses the pair \\r\\n ). 第一种是尝试标准化最早在其中开发出C的* nix系统上的文本文件(本身使用\\n )和Windows上的文本文件(使用对\\r\\n )之间的行尾。 The second is backwards compatibility run amok, retaining a convention that existed before DOS when file sizes couldn't be specified in blocks less than 128 characters. 第二个是向后兼容运行amok,当不能在少于128个字符的块中指定文件大小时,保留了DOS之前存在的约定。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM