C 中的校验和计算器在 Windows 中给出错误的校验和,在 Linux 中给出正确的校验和

Checksum calculator in C gives wrong checksum in Windows, correct in Linux

我使用的校验和计算器来自:https://github.com/Vi1i/OcarinaChecksumChecker

我下载了 ocarina.h 和 checksumCalc.c 文件,并能够使用 WSL 中的 gcc checksumCalc.c 为 Windows(Debian Linux shell 在 Windows 10)。然后它输出文件“a.out”,我可以使用 ./a.out "THE LEGEND OF ZELDA.sra" 0020 运行 并为我的塞尔达传说保存文件计算正确的校验和,与我在十六进制编辑器中看到的相匹配.

然后我决定尝试使用 Windows 编译它。我已经设置了我的 Powershell,所以我可以简单地使用 Powershell 中的“cl”来编译 C 程序。首先,我尝试执行 cl checksumCalc.c,但出现以下错误:

checksumCalc.c(49): error C2065: 'ushort': undeclared identifier

checksumCalc.c(49): error C2146: syntax error: missing ')' before identifier 'data'

checksumCalc.c(49): error C2059: syntax error: ')'

在谷歌搜索第一个错误后,我将 checksumCalc.c 文件中的“ushort”更改为 USHORT,并在文件顶部添加了#include 。我尝试再次编译,它确实编译了。但是,当我尝试 运行 在 Windows 中生成生成的 exe 时,它​​给出了不正确的校验和。我使用与 a.out 文件相同的语法,但将 a.out 替换为 checksumCalc.exe。 checksumCalc.exe "THE LEGEND OF ZELDA.sra" 0020

有谁知道为什么程序在 Windows 和 Linux 中给我的结果完全不同?这是 checksumCalc.c 代码的直接 link:https://github.com/Vi1i/OcarinaChecksumChecker/blob/master/checksumCalc.c

如上所述,我在 Windows 中尝试时唯一改变的是我添加了#include ,并且我将底部的 ushort 全部大写。我希望了解 C 编程的怪癖以及在 Windows 和 Linux 中编译之间的差异的人可以帮助我理解可能出了什么问题。

郑重声明,我可以通过从 Linux shell 获取校验和来轻松完成我想做的事情,但我只是想了解可能发生的事情从学习的角度。我是 C 菜鸟,对我来说我认为 C 是 C,但显然必须有 Linux/Windows 独有的命令,代码需要进行调整才能正常工作。

感谢用户 Maxim Sagaydachny 在评论中提出的提示:

replace FILE *file = fopen(argv[1], "r"); with FILE *file = fopen(argv[1], "rb");

这似乎与 Windows 将文件作为文本文件读取的方式有关,“b”似乎表示文件应作为二进制文件读取。现在 Windows 程序正在生成正确的校验和。

感谢 Maxim Sagaydachny 提供的提示,最终解决了问题。另外,感谢 Joseph Sible-Reinstate Monica 的建议!