Apple的LZF演算法解析

2021-07-24 22:47:03 字數 2409 閱讀 2240

接下來看一下開源的lzf演算法的實現原始碼。

1.定義的全域性字段:

private readonly long _hashtable = new long[hsize];

private const uint hlog = 14;

private const uint hsize = (1 << 14);

private const uint maxlit = (1 << 5);

private const uint maxoff = (1 << 13);

private const uint maxref = ((1 << 8) + (1 << 3));

2.使用liblzf演算法壓縮資料:

/// /// 使用liblzf演算法壓縮資料

/// 

/// 需要壓縮的資料

/// 要壓縮的資料的長度

/// 引用將包含壓縮資料的緩衝區

/// 壓縮緩衝區的長度(應大於輸入緩衝區)

/// 輸出緩衝區中壓縮歸檔的大小

public int compress(byte input, int inputlength, byte output, int outputlength)

len -= 2;

iidx++;

if (len < 7)

else

output[oidx++] = (byte)off;

iidx += len - 1;

hval = (uint)(((input[iidx]) << 8) | input[iidx + 1]);

hval = (hval << 8) | input[iidx + 2];

_hashtable[((hval ^ (hval << 5)) >> (int)(((3 * 8 - hlog)) - hval * 5) & (hsize - 1))] = iidx;

iidx++;

hval = (hval << 8) | input[iidx + 2];

_hashtable[((hval ^ (hval << 5)) >> (int)(((3 * 8 - hlog)) - hval * 5) & (hsize - 1))] = iidx;

iidx++;

continue;}}

else if (iidx == inputlength)

break;

lit++;

iidx++;

if (lit != maxlit) continue;

if (oidx + 1 + maxlit >= outputlength)

return 0;

output[oidx++] = (byte)(maxlit - 1);

lit = -lit;

dooutput[oidx++] = input[iidx + lit];

while ((++lit) != 0);

}if (lit == 0) return (int)oidx;

if (oidx + lit + 1 >= outputlength)

return 0;

output[oidx++] = (byte)(lit - 1);

lit = -lit;

dooutput[oidx++] = input[iidx + lit];

while ((++lit) != 0);

return (int)oidx;

}

3.使用liblzf演算法過載壓縮資料:

/// /// 使用liblzf演算法解壓縮資料

/// 

/// 參考資料進行解壓縮

/// 要解壓縮的資料的長度

/// 引用包含解壓縮資料的緩衝區

/// 輸出緩衝區中壓縮歸檔的大小

/// 返回解壓縮大小

public int decompress(byte input, int inputlength, byte output, int outputlength)

dooutput[oidx++] = input[iidx++];

while ((--ctrl) != 0);

}else

if (reference < 0)

output[oidx++] = output[reference++];

output[oidx++] = output[reference++];

dooutput[oidx++] = output[reference++];

while ((--len) != 0);}}

while (iidx < inputlength);

return (int)oidx;

}

以上是lzf演算法的**。

本文出自 「彭澤0902」 部落格,請務必保留此出處

Apple的LZF演算法解析

接下來看一下開源的lzf演算法的實現原始碼。1.定義的全域性字段 private readonly long hashtable new long hsize private const uint hlog 14 private const uint hsize 1 14 private const...

Apple的LZF演算法解析

接下來看一下開源的lzf演算法的實現原始碼。1.定義的全域性字段 private readonly long hashtable new long hsize private const uint hlog 14 private const uint hsize 1 14 private const...

Apple的LZF演算法解析

接下來看一下開源的lzf演算法的實現原始碼。1.定義的全域性字段 private readonly long hashtable new long hsize private const uint hlog 14 private const uint hsize 1 14 private const...