【问题标题】:hex value 00 to ascii or char [closed]十六进制值 00 到 ascii 或 char [关闭]
【发布时间】:2013-06-05 17:37:05
【问题描述】:

我正在编写自适应霍夫曼算法,但遇到了问题。一个字节一个字节地读取 JPG 文件,我最终碰到了这个十六进制值 00。我的程序读取为“0”。

查看图片:http://shrani.si/f/u/Ub/3Yv2Q0LA/napaka.jpg

如您所见,前两个字符用字符之前的值表示。 -somenumber 'char'。

在第三种情况下,只传递了零,但我的算法没有对它做任何事情,因为它不能代表 char。我该如何解决这个问题,我还需要将这些值存储到我的树中,以便我可以压缩并最终解压缩。

干杯

【问题讨论】:

  • 0 不是可打印的字符,你期望什么?
  • 你想用二进制零做什么?顺便说一下,这在每个基数中都是零,零就是零。而且没有“char”来表示二进制零,不知道你要完成什么?
  • 我看这里没有代码可以帮助你。任何类型的“读取”例程都可以将二进制数据读入内存。该内存可以读取为 char、unsigned char、int 等等。我相信你在这里可能有一个概念问题。
  • 在这里发布一些代码。我将二进制零表示为\0

标签: c++ hex ascii


【解决方案1】:

char 是一个数字(在大多数系统上它是一个 8 位数字,但不是全部)。您所看到的是 IDE 使用单引号 ASCII 字符等效显示数值。并非所有字符都映射到可打印的 ASCII 字符(有关详细信息,请参阅 here)。

如果 IDE 认为没有可打印的等价物,它就不会费心打印单引号的等价物。当您在代码中将某些内容放在单引号中时,您是在告诉编译器将该字符替换为数字 ASCII 等价物。因此以下是等价的:

#include<stdio.h> // C
#include<cstdio>  // C++
int main()
{
  char x = 'A';
  char y = 65;
  if (x == y)
  {
    printf("var x is the same as y. '%c' == '%c'\n", x, y);
  }
  else
  {
    printf("ERROR: var x is different then y. '%c' == '%c'\n", x, y);
  }
}

输出将是:

var x is the same as y. 'A' == 'A'

【讨论】:

  • 我知道你想告诉我什么。但是你能帮我吗,我怎么能把它储存在树上,这样我就可以再读一遍了?如果您熟悉霍夫曼算法,您就会知道它存储了他获得的每个字符或每个符号。所以 0 也是我解压时需要回写的符号。怎么样?
  • 用谷歌搜索不难找到霍夫曼。我自己专业地编码了几次。随便看看吧。
  • 它已经在处理普通的 txt 文件,其中的字符通常是代表的。但是有了 jpg 文件和 00 十六进制,我就完蛋了。我只需要解决这个问题,然后它应该可以工作
  • 在你的问题中举个例子,我会试着回答。
  • 我已经设法解决了这个问题。这是一个概念问题。我添加了一个布尔值来检查这是否甚至是树中正确的“符号”。最终它也添加了零并正确编码。图像被压缩和解压缩,没有任何数据丢失。至于管理员,我很抱歉问了一个“愚蠢”的问题,尽管答案帮助我理解了我的问题,我最终会提出正确的问题。谢谢大家的回答!
猜你喜欢
  • 2011-12-09
  • 1970-01-01
  • 2015-08-23
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 2011-10-28
  • 2014-06-22
相关资源
最近更新 更多