【问题标题】:C: Read hex written in ASCII [duplicate]C:读取用 ASCII 编写的十六进制 [重复]
【发布时间】:2014-09-04 21:12:41
【问题描述】:

我希望编写一个 C 程序来读取存储在文件中的 1 字节十六进制值。我浏览了包括 StackOverflow 在内的互联网,但我的要求似乎与平均水平不同:

我有一个包含以下内容的文本文件 - 它们是单字节十六进制值:

35 36 37 38

十进制即:

53, 54, 55, 56

十六进制值是以下 ASCII 字符

5 6 7 8

我想从包含 ASCII 35 36 37 38 四个十六进制字节的文本文件中读取它。我一直在修改FILE 指针和fread(),但它读取35 值,例如35,它作为33 35 存储在缓冲区中(3 的十六进制和5 单独)。所以我的问题是......

短版

有没有办法一次读取两个 ASCII 字符的文件(不是一次读取两个字节,因为那样会产生不同的结果!)。也许我应该读成一个字符?与其提供一些代码并声明它不像 SO 上通常发生的那样工作,我不确定如何从这个开始,所以我没有代码可以提供。您不必为我编写代码,但有关如何处理问题场景的一些指导会很好。

【问题讨论】:

  • 空格呢?
  • 像你这样的人应该知道分数 - 你需要写一些代码让我们评论/修复它。
  • @EdHeal - 为什么必须发布代码? StackOverflow 上是否禁止谈论如何解决编程问题?能不能不讨论问题的逻辑,甚至伪代码?
  • fscanf(fp, "%x", &h) ... printf("%c ", (char)h);
  • @KerrekSB - 关于空间的好点,我想忽略它们,我会更新帖子。关于“有没有办法” - 我也应该更清楚一点,我的意思是is there a way that doesn't involve some really obscure or non-constructive code like casting to an int which is cast to base 16 and then cast to a popsicle and then printed from printf() into cout()

标签: c file-io hex


【解决方案1】:

确实可以一次读取两个字符:

unsigned int dehex(FILE * p)
{
    char two[2];
    if (2 != fread(two, 1, 2, p)) { abort(); }

    return as_hex(two[0]) * 16 + as_hex(two[1]);
}

unsigned int as_hex(char c)
{
    if ('0' <= c && c <= '9') { return c - '0'; }
    if ('a' <= c && c <= 'f') { return c + 10 - 'a'; }
    if ('A' <= c && c <= 'F') { return c + 10 - 'A'; }
    abort();
}

【讨论】:

    猜你喜欢
    • 2011-08-02
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 2017-04-13
    相关资源
    最近更新 更多