Skip to content

Commit 7d6e07c

Browse files
committed
LZ4 Decode
1 parent 538c193 commit 7d6e07c

2 files changed

Lines changed: 54 additions & 1 deletion

File tree

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public static void DecompressToStream(ReadOnlySpan<byte> compressedData, Stream
1212
{
1313
case "lz4":
1414
byte[] decompressedData = new byte[decompressedSize];
15-
LZ4Codec.Decode(compressedData, new Span<byte>(decompressedData));
15+
LZ4.Decode(compressedData, new Span<byte>(decompressedData));
1616
decompressedStream.Write(decompressedData, 0, decompressedData.Length);
1717
break;
1818
case "lzma":

UnityAsset.NET/Compression/LZ4.cs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
namespace UnityAsset.NET;
2+
3+
public static class LZ4
4+
{
5+
public static unsafe int Decode(ReadOnlySpan<byte> source, Span<byte> target)
6+
{
7+
int length1 = source.Length;
8+
if (length1 <= 0)
9+
return 0;
10+
fixed (byte* sourcePtr = &source.GetPinnableReference())
11+
fixed (byte* targetPtr = &target.GetPinnableReference())
12+
{
13+
byte* s = sourcePtr;
14+
byte* t = targetPtr;
15+
byte* sourceEnd = sourcePtr + source.Length;
16+
while (s < sourceEnd)
17+
{
18+
byte token = *s++;
19+
int literalLength = token >> 4;
20+
int matchLength = token & 0xF;
21+
if (literalLength == 0xF)
22+
{
23+
byte b;
24+
do
25+
{
26+
b = *s++;
27+
literalLength += b;
28+
} while (b == 0xFF && s < sourceEnd);
29+
}
30+
Buffer.MemoryCopy(s, t, literalLength, literalLength);
31+
s += literalLength;
32+
t += literalLength;
33+
34+
if (s >= sourceEnd) break;
35+
36+
int offset = *s++ | (*s++ << 8);
37+
if (matchLength == 0xF)
38+
{
39+
byte b;
40+
do
41+
{
42+
b = *s++;
43+
matchLength += b;
44+
} while (b == 0xFF && s < sourceEnd);
45+
}
46+
matchLength += 4;
47+
Buffer.MemoryCopy(t - offset, t, matchLength, matchLength);
48+
t += matchLength;
49+
}
50+
return (int)(t - targetPtr);
51+
}
52+
}
53+
}

0 commit comments

Comments
 (0)