位压缩算法是一种应用于数据长度编码的快速,简单无损的数据压缩方案。
苹果公司在Mactionsh计算机上首先推出的这种算法。这是一种可以用在TIFF文件上的压缩算法。TAG文件也使用这种RLE压缩方案,但是其将数据视为像素而不是字节。
一个压缩位数据流是以一个字节的头(header),后接数据(data)的形式组织数据:数据可以被标记,不标记或者进行压缩。在下面的表中,n是被做了标记的Data的数据个数。
苹果公司提供了如下简短压缩后的数据:FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA
依据压缩算法,相应的解压缩算法:(VB)代码如下:
Sub UnpackBitsDemo()
Dim File As Variant
Dim MyOutput As String
Dim Count As Long
Dim i As Long, j As Long
File = "FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA"
File = Split(File, " ")
For i = LBound(File) To UBound(File)
Count = Application.WorksheetFunction.Hex2Dec(File(i))
Select Case Count
Case Is >= 128
Count = 256 - Count 'Two's Complement
For j = 0 To Count 'zero-based
MyOutput = MyOutput & File(i + 1) & " "
Next j
i = i + 1 'Adjust the pointer
Case Else
For j = 0 To Count 'zero-based
MyOutput = MyOutput & File(i + j + 1) & " "
Next j
i = i + j 'Adjust the pointer
End Select
Next i
Debug.Print MyOutput
'AA AA AA 80 00 2A AA AA AA AA 80 00 2A 22 AA AA AA AA AA AA AA AA AA AA
End Sub
JS的实例如下:
/**
* Helper functions to create readable input and output
*
* Also, see this fiddle for interactive PackBits decoder:
* https://jsfiddle.net/volter9/tj04ejdt/
*/
function str2hex (str) {
return str.split('').map(function (char) {
var value = char.charCodeAt(0);
return ((value < 16 ? '0' : '') + value.toString(16)).toUpperCase();
}).join(' ');
}
function hex2str (hex) {
return hex.split(' ').map(function (string) {
return String.fromCharCode(parseInt(string, 16));
}).join('');
}
/**
* PackBits unpack function
*
* @param {String} data
* @return {String}
*/
function unpackBits (data) {
var output = '',
i = 0;
while (i < data.length) {
var hex = data.charCodeAt(i);
if (hex >= 128) {
hex = 256 - hex;
for (var j = 0; j <= hex; j ++) {
output += data.charAt(i + 1);
}
i ++;
}
else {
for (var j = 0; j <= hex; j ++) {
output += data.charAt(i + j + 1);
}
i += j;
}
i ++;
}
return output;
}
var original = 'FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA',
data = unpackBits(hex2str(original));
// Output is: AA AA AA 80 00 2A AA AA AA AA 80 00 2A 22 AA AA AA AA AA AA AA AA AA AA
console.log(str2hex(data));