单字节字符代码

时间:2013-11-24 06:16:36

标签: c++ encoding char

我正在尝试实现压缩算法,为此我需要一个单字节字符代码数组 - 它们必须是单字节。我不熟悉如何在编程中处理字符代码,但要求是它们应该是单字节而且不依赖于OS /机器。是0到255的整数值是否容易?

如果是这种情况,我使用以下小片段来查看我可以使用哪些字符:

for (int i = 0; i < 256; i++) {
    std::cout << (char)i << std::endl;
}

似乎许多第一个数字是看不见的空白字符,而最后一个数字都显示为?

编辑:

更具体地说,我正在尝试为此paper实现类似的算法。它将DNA序列切割成4段,并使用哈希表转换它们,因此例如AAAA转换为由单字节字符编码的字符,AAAT转换为单字节字符。对于DNA,1字节中的4字节是非常好的压缩(尽管如果我想将字母表从A,T,C,G扩展到A,T,C,G,N,并且 - 我需要6 ^ 4个字符而不是4字母字母表所需的256个。我可以将压缩从4合1减少到3合一,只需要216个单字节字符代码。

这种压缩是我正在尝试编写的内容的一部分,应该从多序列比对中读取序列(6个字母A,T,C,G,N和 - 的序列/字符串)可能非常很大。并删除我的分析程序无法提供的所有信息。我计划通过尽可能地压缩序列,然后在压缩表示中找到无信息的东西,然后扩展剩余的东西,然后进行第二次扫描并在未压缩的表示中去掉剩余的无信息的东西,之前在准备分析程序时再次压缩剩余的信息资料。

也许有比哈希方案更好的方案,我听说过一些我需要阅读的基于参考的方案。我也想过,一旦DNA字符串被压缩成256字节格式,可以用压缩常规文本的方法进一步压缩吗?

2 个答案:

答案 0 :(得分:1)

为什么会看到此输出

某些ASCII codes不可打印。使用isprint()检查字符是否可打印。

还值得注意的是你的shell使用什么编码。现代设置使用UTF-8,因此如果您尝试打印扩展的ASCII代码,则在输出到终端时,它们可能已被(错误地)解释为multibyte UTF-8 sequences而不是ASCII。

如何处理二进制数据

如果您处理的是运算二进制数据的算法,比如压缩,那么最好完全忽略字符编码。避免将数据解释为终端中的字符串,并将其视为整数序列0-255。在调试时将数据传输到hexdump或打印每个字节的整数值。

答案 1 :(得分:0)

有多个字符集。如果您想要单字节保证的单字节,那么您需要ASCII字符集。如果你想支持非英语语言,你可以使用特定的代码页,但是你必须决定哪一个。

另请注意,您可以使用char(8位,有符号)和字节(8位,无符号)进行计算。

以下是角色列表及其解释:http://en.wikipedia.org/wiki/ASCII

字符集肯定是依赖于操作系统的。我建议你使用UTF-8,并且知道 - 通常 - 你将获得单个字符字节。

P.S。如果您正在压缩文件,为什么还要关心?逐字节读取文件(或char-by-char)并在另一端再现相同的字节/字符肯定会有效。