gpt4 book ai didi

c - 字符串比较中的十六进制文字问题

转载 作者:太空宇宙 更新时间:2023-11-04 05:15:49 25 4
gpt4 key购买 nike

我正在读取一个 NES ROM 文件,其中前四个字节是“\x4e\x45\x53\x1a”或 NES\x1a。在我的实际代码中,给定的文件可以是任意的,因此我想检查以确保此 header 在此处。但是,我遇到了一些麻烦,以下代码演示了这一点:

#include <stdio.h>
#include <string.h>

int main()
{
FILE *fp;
fp = fopen("mario.nes", "rb");

char nes[4];
char real_nes[4] = "NES\x1a";
fread(nes, 4, 1, fp);
printf("A: %x\n", nes[3]);
printf("B: %x\n", real_nes[3]);
printf("C: %s\n", nes);
printf("D: %s\n", real_nes);
if (strcmp(nes, real_nes) != 0) {
printf("not a match\n");
}
fclose(fp);
return 0;
}

返回:

A: 1a
B: 1a
C: NES?
D: NES
not a match

问号是\x1a。

我是 C 的新手,所以我可能遗漏了一些微妙的(或明显的)关于为什么两个字符串不匹配,以及为什么在打印 D 行时问号不显示的原因,以表示\x1a 在字符串的末尾,B 行似乎表明它应该是。

最佳答案

一些意见和建议:

  • 以二进制模式打开文件 - 否则,在非 POSIX 系统上可能会发生有趣的事情(已修复)

    fp = fopen("mario.nes", "rb");
  • 如果您想打印或比较它们或使用像 strncmp() 这样接受字符串长度作为额外参数的函数,则以 null 终止您的缓冲区

    printf("C: %.4s\n", nes);
    printf("D: %.4s\n", real_nes);
    if (strncmp(nes, real_nes, 4) != 0) {
  • '\x1a'是非图形替换字符^Z

  • 检查 io 函数的返回值是否有错误

关于c - 字符串比较中的十六进制文字问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1390455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com