Java 1'的分裂序列;s和0';s转换为字节
我目前正在进行哈夫曼解码。我有一个Java 1'的分裂序列;s和0';s转换为字节,java,file,compression,huffman-code,Java,File,Compression,Huffman Code,我目前正在进行哈夫曼解码。我有一个字符串表示所有字符编码(即“1101000000000001”)。我试图将其分成8组,并返回其相应的值(即“11010001”将返回209)。但是,它似乎不适用于较小的文件。下面是我的代码。提前感谢您的帮助 for(char bit : textbytes.toCharArray()) { if(bit == '1') { target
字符串
表示所有字符编码(即“1101000000000001”)。我试图将其分成8组,并返回其相应的值(即“11010001”将返回209)。但是,它似乎不适用于较小的文件。下面是我的代码。提前感谢您的帮助
for(char bit : textbytes.toCharArray())
{
if(bit == '1')
{
target |= 1 << bitCount;
}
bitCount++;
if(bitCount >= 8)
{
bitCount = 0;
bits.add(target);
target = 0;
}
}
byte[] bitstring = new byte[bits.size()];
for(int i = 0; i < bits.size(); i ++)
{
bitstring[i] = bits.get(i);
compressedFile.write(bitstring[i]);
}
for(字符位:textbytes.toCharArray())
{
如果(位=='1')
{
目标|=1=8)
{
比特数=0;
位。添加(目标);
目标=0;
}
}
byte[]bitstring=新字节[bits.size()];
对于(int i=0;i
另外,我从互联网上获取了一些部分,因此我不完全理解它(例如
target |=1听起来你还没有尝试进行哈夫曼编码,只需将0
或1
的“二进制”String
S转换为Java整数类型即可。尝试以下方法:
public static long decode(String textbytes) {
long result=0;
for(char ch : textbytes.toCharArray()) {
result = result << 1;
if(ch == '1')
result = result + 1;
}
return result;
}
公共静态长解码(字符串textbytes){
长结果=0;
for(char ch:textbytes.toCharArray()){
结果=结果209)
方法非常简单:
从result=0开始
对于输入字符串中的每个字符,向左移动result
1位,为当前字符表示的位“腾出空间”。然后,如果当前字符表示1
位,则添加1
以生成结果
此外,该代码假定您没有得到超过64位的位字符串,您可能需要检查其健壮性。我会以不同的方式进行操作
byte[] bytes = new BigInteger("1101000100000001", 2).toByteArray();
for (byte b : bytes) {
compressedFile.write(b);
}
任何特定的语言偏好?我认为你应该用0shmm填充它。它似乎也不适用于较小的文件,即使有8个以上的1和0。如果我使用FileInputStream read()方法读取字节,那么不管有多少位,它仍然会吗?我知道read()方法读取一个字节的数据,所以如果“1101000000000001”是完全编码而不被分解的,它会影响read()的工作方式吗?因为我存储数据的方式(在长的中),此方法最多只能处理64位。如果以不同的方式存储数据,例如,在本线程的另一个答案中,将数据存储在biginger
中,则此方法将处理尽可能多的位(当然,内存允许)。只要您确定要读取的唯一字符是'1'
或'0'
,以字符或字节读取就没有区别。