如何存储二进制文件

_Wanghui_ 2005-04-22 08:22:55
我在做一道数据结构的作业,压缩文本文件

读取文件中的字符,转换为赫夫曼编码,然后应该是按位存储
(比如a是00,b是01,c是10,d是11...)

可是我不知道怎么存储这些编码

请高手详细指点!
...全文
246 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhang_jiang 2005-04-25
  • 打赏
  • 举报
回复
byte在内存中的表示:
byte:
7 6 5 4 3 2 1 0
+-+-+-+-+-+-+-+-+
| | | | | | | | |
+-+-+-+-+-+-+-+-+
字符串为: "abcda"
byte |= mask[c[i] - 'a']<<count; // 将byte的0,1位赋值为 0, 0
7 6 5 4 3 2 1 0
+-+-+-+-+-+-+-+-+
| | | | | | |0|0|
+-+-+-+-+-+-+-+-+
count +=masklen[c[i]-'a']; // count由0变为2, 指向byte的2位
...
7 6 5 4 3 2 1 0
+-+-+-+-+-+-+-+-+
|1|1|1|0|0|1|0|0|
+-+-+-+-+-+-+-+-+
"abcd"的编码赋值给byte后,此时count=8
将byte存到文件中去, outputbyte();
清byte为0, 下个字符为'a'
...

============================================
还有个情况要考虑,
7 6 5 4 3 2 1 0
+-+-+-+-+-+-+-+-+
| |1|1|0|0|1|0|0|
+-+-+-+-+-+-+-+-+
count = 7, 指向byte的7位, 若此时下个字符为'a'
先将'a'的编码的第一位赋值给byte的7位
byte |= (mask[c[i]-'a']|(1<<(8 - count)-1))<<count;
保存完byte后, 将'a'编码的2位以后赋值给byte的0,1,...位
tmp = mask[c[i]-'a']>>(8-count);
byte=0;
byte|= tmp<<count;
count = masklen[c[i]-'a']+count-8;
_Wanghui_ 2005-04-25
  • 打赏
  • 举报
回复
老实说看不明白...
zhang_jiang 2005-04-24
  • 打赏
  • 举报
回复
修改了一下:

int count=0;
char byte=0;
char mask[N]={0, 1, 2, 3, ...}; // 00, 01, 10, 11, ...
int masklen[N]={2,2,2,2, ...}; // length of mask
int tmp;

for( ...; ...; ...)
{
if(count + masklen[c[i] - 'a'] >= 8) // c -- input character
{
byte |= (mask[c[i]-'a']|(1<<(8 - count)-1))<<count;
outputbyte(); // save byte to some file
tmp = mask[c[i]-'a']>>(8-count);
byte=0;
byte|= tmp<<count;
count = masklen[c[i]-'a']+count-8;
}
else
{
byte |= mask[c[i] - 'a']<<count;
count += masklen[c[i]-'a'];
}
}
_Wanghui_ 2005-04-23
  • 打赏
  • 举报
回复
我看看
zhang_jiang 2005-04-23
  • 打赏
  • 举报
回复
int count=0;
char byte=0;
char mask[N]={0, 1, 2, 3, ...}; // 00, 01, 10, 11, ...
int masklen[N]={2,2,2,2,...} // length of mask
int tmp;
for(;...;)
{
if(count + masklen[c - 'a'] >= 7) // c -- input character
{
byte |= (mask[c-'a']|(1<<(8 - count)-1))<<count;
outputbyte(); // save byte to some file
tmp = mask[c-'a']>>(8-count);
byte=0;
byte|= tmp<<count;
}
else
byte |= mask[c - 'a']<<count;
}

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧