我正在用C ++编写一个霍夫曼编码程序,我正在使用这个网站作为参考:
http://algs4.cs.princeton.edu/55compression/Huffman.java.html
我现在使用的是writeTrie方法,这是我的版本:
// write bitstring-encoded tree to standard output
void writeTree(struct node *tempnode){
if(isLeaf(*tempnode)){
tempfile << "1";
fprintf(stderr, "writing 1 to file\n");
tempfile << tempnode->ch;
//tempfile.write(&tempnode->ch,1);
return;
}
else{
tempfile << "0";
fprintf(stderr, "writing 0 to file\n");
writeTree(tempnode->left);
writeTree(tempnode->right);
}
}
看看评论的那一行 - 假设我正在写一个文本文件,但我想在tempnode-&gt; ch(这是一个unsigned char,btw)中编写构成char的字节。有关如何进行此操作的任何建议?注释的行给出了从unsigned char *到const char *。
的无效转换错误提前致谢!
编辑:澄清一下:例如,我希望我的最终文本文件是二进制的 - 只有1和0。如果你查看我提供的链接的标题,他们给出了一个“ABRACADABRA!”的例子。以及由此产生的压缩。我想取char(例如上面'A'中的例子),使用它的无符号int数(A ='65'),并以二进制形式写65,作为一个字节。
答案 0 :(得分:3)
char与字节相同。上一行tempfile << tempnode->ch;
已经完全符合您的要求。
write
unsigned char
没有超载,但如果您愿意,可以
tempfile.write(reinterpret_cast< char * >( &tempnode->ch ),1);
这相当丑陋,但它与tempfile << tempnode->ch
完全相同。
编辑:哦,你想为字节中的位写一个1
和0
字符序列。 C ++有一个不起眼的技巧:
#include <bitset>
tempfile << std::bitset< 8 >( tempnode->ch );