在C ++中将字符写为字节

时间:2012-04-13 02:28:11

标签: c++ compression

我正在用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,作为一个字节。

1 个答案:

答案 0 :(得分:3)

char与字节相同。上一行tempfile << tempnode->ch;已经完全符合您的要求。

write unsigned char没有超载,但如果您愿意,可以

tempfile.write(reinterpret_cast< char * >( &tempnode->ch ),1);

这相当丑陋,但它与tempfile << tempnode->ch完全相同。

编辑:哦,你想为字节中的位写一个10字符序列。 C ++有一个不起眼的技巧:

#include <bitset>

tempfile << std::bitset< 8 >( tempnode->ch );