我正在尝试实现一个压缩算法,为此我需要有一个单字节字符代码数组-它们必须是单字节的。我不熟悉如何在编程中处理字符代码,但要求它们应该是单字节的,并且不依赖于操作系统/机器。是不是像整数值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比1,并且只需要216个单字节字符代码。
这种压缩是我试图写的东西的一部分,它应该从可能非常非常大的多个序列对齐(6个字母表A,T,C,G,N和-的序列/字符串)中读取序列。删除所有对我的分析程序没有意义的东西。我计划这样做:尽可能地压缩序列,然后在压缩的表示中找到没有信息的东西,然后展开剩余的东西,然后进行第二次扫描,去掉未压缩的表示中的剩余的无信息的东西,然后再次压缩剩余的信息,为分析程序做准备。
也许有比哈希方案更好的方案,我听说过一种叫做基于引用的方案,我需要去读一读。我还认为,一旦DNA字符串被压缩成256个单字节的格式,用来压缩普通文本的方法还能进一步压缩吗?
发布于 2013-11-24 14:20:55
为什么您会看到此输出
一些ASCII codes是不可打印的。使用isprint()检查字符是否可打印。
同样值得注意的是,您的shell使用的是什么编码。现代设置使用UTF-8,因此如果您尝试打印扩展ASCII码,当输出到终端时,它们可能被(错误地)解释为multibyte UTF-8 sequences,而不是ASCII码。
应该如何处理二进制数据
如果您使用的是对二进制数据进行操作的算法,比如压缩,那么最好完全忽略字符编码。避免在终端中将数据解释为字符串,并将其视为0-255的整数序列。通过管道将数据导入hexdump或在调试时打印每个字节的整数值。
发布于 2013-11-24 14:24:45
有多个字符集。如果你想要单字节-guaranteed单字节-那么你需要ASCII码字符集。如果您想支持非英语语言,可以使用特定的代码页,但您必须决定使用哪种语言。
还要注意,您可以使用char (8位,有符号)和byte (8位,无符号)进行计算。
以下是字符及其解释的列表:http://en.wikipedia.org/wiki/ASCII
字符集绝对依赖于操作系统。我建议您使用UTF-8,并且知道-大多数情况下-您将获得单字符字节。
附注:如果你在压缩文件,为什么你会关心呢?逐字节(或逐字符)读取文件并在另一端重新生成相同的字节/字符肯定是可行的。
https://stackoverflow.com/questions/20171748
复制相似问题