开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
OSX + XCode
Linux +Vim
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
应该就C++中的STL吧
问题(Question):
各位版上的高手大家好 小弟只是并没有受过专业coding训练
充其量只是个script kiddie
读了别人的code以后在内化成自己的code
但是在自己重制的过程中遇到很多概念的问题 所以不要鞭太大力
程式码:
http://codepad.org/n9r2L1vQ
我现在在完成一个霍夫曼编码的程式
因为这个霍夫曼要能够读任何档案
所以我猜应该是先把档案读成Binary档以后存进f[256]这个阵列里面
(应该是ASCII字符组成这个档案吧?)
然后再把每个字符出现的频率找出来 这是第一步
接着要做的应该是把这些字符出现的频率一起写进output的档案
这样在还原压缩档的时候才可以重建霍夫曼树吧?
这边我就开始不太懂了 程式码内有四行:
fout.put(static_cast<unsigned char>(f[i]>>24));
fout.put(static_cast<unsigned char>((f[i]>>16)%256));
fout.put(static_cast<unsigned char>((f[i]>>8)%256));
fout.put(static_cast<unsigned char>(f[i]%256));
这边这四行的意思是不是指把出现频率这个数字转换成16进位这件事情?
因为现在我疑惑的地方是
例如我出现的f[0] = 7920 但是实际转换在16进位是1ef0 写进档案时却要是0000 1ef0
为什么要多这些0000?
ex:
code: f[0] f[1] f[2] f[3]
16进位: 7920 4550 4808 3992
File: 0000 1ef0 0000 11c6 0000 12c8 0000 0f98
因为现在这个程式确实可以运作的 但是我想了解0000这个用意是什么?
因为我查到板上有人也有做霍夫曼 但是他的档案压缩完却会变大
我查到他后来用write有解决这个问题
但是我有试着用write写过一次
出来的结果却是
f01e 0000 c611 0000 c812 0000 980f 0000
感觉像是颠倒 又不像是 还原结果也不对
想请教前辈这些到底有什么含意? 有什么不同? 我该往哪方向去找资料?
是不是程式码内的huf_read and huf_write都是在做这一系列类似的操作?
谢谢
因为资料大部分都是从网络跟书本找的
所以有点零碎 希望把一些概念厘清 希望高手指点我该往哪方面在找资料 谢谢
喂入的资料(Input):
预期的正确结果(Expected Output):
错误结果(Wrong Output):
程式码(Code):(请善用置底文网页, 记得排版)
补充说明(Supplement):