我正在编写霍夫曼压缩/解压缩程序。我已经开始编写我的压缩方法,但我陷入困境。我试图读取文件中的所有字节,然后将所有字节放入字节数组中。将所有字节放入字节数组后,我创建一个int[]数组,用于存储每个字节的所有频率(索引为 ASCII 代码)。
它确实包含扩展 ASCII 表,因为int数组的大小为 256。但是,当我在文件中读取特殊字符(又名 ASCII 值高于 127 的字符)时,我就会遇到问题。我知道一个字节是有符号的,一旦超过 127 个数字限制(并且数组索引显然不能为负数),它就会环绕为负值,因此我尝试通过在指定时将其转换为有符号值来解决此问题我的数组索引 ( array[myByte&0xFF])。
这种方法有效,但它给了我错误的 ASCII 值(例如,如果字符的正确 ASCII 值是 134,我反而得到 191 或其他值)。更烦人的是,我注意到特殊字符被分成 2 个单独的字节,我觉得这会在以后引起问题(例如当我尝试解压缩时)。
如何使我的程序与每种类型的字符兼容(该程序应该能够压缩/解压缩图片、mp3 等)。
也许我对此采取了错误的方法,但我不知道正确的方法是什么。请给我一些构建这个的提示。
树:
package CompPck;
import java.util.TreeMap;
abstract class Tree implements Comparable<Tree> {
public final int frequency; // the frequency of this tree
public Tree(int freq) { frequency = freq; }
// compares on the frequency
public int compareTo(Tree tree) {
return frequency - tree.frequency;
}
}
class Leaf …Run Code Online (Sandbox Code Playgroud) 我刚刚开始学习Haskell并且我简要地阅读了一些缩进规则,在我看来,当涉及到缩进时,Haskell就像Python一样(我可能错了).无论如何,我试着写一个尾递归的斐波纳契函数,我不断收到缩进错误,我不知道在哪里缩进我的代码错了.
错误信息:
F1.hs:6:9: error:
parse error (possibly incorrect indentation or mismatched brackets)
|
6 | |n<=1 = b | ^
Run Code Online (Sandbox Code Playgroud)
码:
fib :: Integer -> Integer
fib n = fib_help n 0 1
where fib_help n a b
|n<=1 = b
|otherwise fib_help (n-1) b (a+b)
Run Code Online (Sandbox Code Playgroud)
注意:我在Notepad ++中编写代码并且我更改了设置,以便在我TAB时创建4个空格而不是制表符(就像我猜的那样)
我是Haskell的新手(以及一般的函数式编程),我正在尝试编写一个名为"profileDistance m1 m2"的函数,该函数将两个矩阵作为参数,需要计算每个矩阵中每个元素之间差异的总和.我可能没有那么好解释.让我来表现一下吧.
矩阵的形式为:[[(Char,Int)]]
每个矩阵可能看起来像这样:
m1 = [[('A',1),('A',2)],
[('B',3),('B',4)],
[('C',5),('C',6)]]
m2 = [[('A',7),('A',8)],
[('B',9),('B',10)],
[('C',11),('C',12)]]
Run Code Online (Sandbox Code Playgroud)
(注意:我在这个例子中按顺序编写了数字,但它们可以是任何顺序的任何数字.但是每个矩阵中每行的字符将匹配如示例中所示.)
结果(在上面的例子中)看起来像(伪代码):
result = ((snd m1['A'][0])-(snd m2['A'][0]))+((snd m1['A'][1])-(snd m2['A'][1]))+((snd m1['B'][0])-(snd m2['B'][0]))+((snd m1['B'][1])-(snd m2['B'][1]))+((snd m1['C'][0])-(snd m2['C'][0]))+((snd m1['C'][1])-(snd m2['C'][1]))
Run Code Online (Sandbox Code Playgroud)
这在任何具有for循环且无功能的语言中都很容易,但我不知道如何在Haskell中执行此操作.我有一种感觉功能map,fold或者sum会帮助我(不可否认,我不是100%肯定如何fold工作).我希望有一个简单的方法来做到这一点......请帮忙.
haskell ×2
byte ×1
compression ×1
huffman-code ×1
indentation ×1
iterator ×1
java ×1
loops ×1
matrix ×1
parsing ×1
python ×1
sum ×1
syntax-error ×1