-
Notifications
You must be signed in to change notification settings - Fork 0
/
packbits.dart
78 lines (75 loc) · 2.43 KB
/
packbits.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// This function takes a hex string list and converts it to a Pack-Bits encoded
// hex string.
// Example: (["00", "00", "00"]) => "fe00"
String packBitsEncode(List<String> hexStringList) {
debugPrint("PACKBITS ENCODE: $hexStringList, ${hexStringList.length}");
String encodedString = "";
int reps = 1;
String copyBuffer = "";
for (int i = 0; i < hexStringList.length; i++) {
if (i + 1 == hexStringList.length) {
if (hexStringList[i - 1] == hexStringList[i]) {
encodedString += (257 - reps).toRadixString(16).padRight(2, "0");
encodedString += hexStringList[i];
reps = 1;
} else {
copyBuffer += hexStringList[i];
encodedString +=
(copyBuffer.length ~/ 2 - 1).toRadixString(16).padLeft(2, "0");
encodedString += copyBuffer;
copyBuffer = "";
}
break;
} else if (hexStringList[i] == hexStringList[i + 1]) {
if (copyBuffer.isNotEmpty) {
encodedString +=
(copyBuffer.length ~/ 2 - 1).toRadixString(16).padLeft(2, "0");
encodedString += copyBuffer;
copyBuffer = "";
}
reps++;
continue;
}
if (reps >= 2) {
encodedString += (257 - reps).toRadixString(16).padRight(2, "0");
encodedString += hexStringList[i];
reps = 1;
} else {
copyBuffer += hexStringList[i];
}
}
debugPrint("PACKBITS ENCODE: $encodedString");
return encodedString;
}
// This function considers 0-127 as copy, 129-255 as repetition
// Decodes a Pack-Bits encoded Uint8List to a list of integers
// Example: ("cf00") => Array of fifty zeroes [0, 0, 0, ... 0]
// Example 2: ("fe00") => "fe" is 254 in decimal, so 255 - 254 = 1, so 1 zero
List<int> packbitsDecode(Uint8List encodedList) {
List<int> decodedList = [];
int leap = 1;
for (int i = 0; i < encodedList.length; i += leap) {
int converted = 0;
int item = encodedList[i];
if (item >= 0 && item <= 127) {
// 0 - 127: Copy
int cpy = item + 1;
for (int j = 0; j < cpy; j++) {
decodedList.add(encodedList[i + 1 + j]);
converted++;
}
leap = 1 + converted;
} else if (item >= 129 && item <= 255) {
// 129 - 255: Repetition
int rep = 257 - item;
for (int j = 0; j < rep; j++) {
decodedList.add(encodedList[i + 1]);
}
leap = 2;
} else {
leap = 2;
}
}
debugPrint("PACKBITS DECODE: $decodedList, ${decodedList.length}");
return decodedList;
}