Sfoglia il codice sorgente

Merge branch 'master' into writer-concurrency

# Conflicts:
#	lz4.go
#	writer.go
Pierre Curto 6 anni fa
parent
commit
8c52d09227
2 ha cambiato i file con 19 aggiunte e 6 eliminazioni
  1. 17 4
      lz4.go
  2. 2 2
      reader.go

+ 17 - 4
lz4.go

@@ -10,6 +10,8 @@
 //
 package lz4
 
+import "math/bits"
+
 import "sync"
 
 const (
@@ -41,10 +43,10 @@ const (
 
 // map the block max size id with its value in bytes: 64Kb, 256Kb, 1Mb and 4Mb.
 const (
-	blockSize64K  = 64 << 10
-	blockSize256K = 256 << 10
-	blockSize1M   = 1 << 20
-	blockSize4M   = 4 << 20
+	blockSize64K = 1 << (16 + 2*iota)
+	blockSize256K
+	blockSize1M
+	blockSize4M
 )
 
 var (
@@ -76,6 +78,17 @@ func putBuffer(size int, buf []byte) {
 		bsMapValue[size].Pool.Put(buf[:cap(buf)])
 	}
 }
+func blockSizeIndexToValue(i byte) int {
+	return 1 << (16 + 2*uint(i))
+}
+func isValidBlockSize(size int) bool {
+	const blockSizeMask = blockSize64K | blockSize256K | blockSize1M | blockSize4M
+
+	return size&blockSizeMask > 0 && bits.OnesCount(uint(size)) == 1
+}
+func blockSizeValueToIndex(size int) byte {
+	return 4 + byte(bits.TrailingZeros(uint(size)>>16)/2)
+}
 
 // Header describes the various flags that can be set on a Writer or obtained from a Reader.
 // The default values match those of the LZ4 frame format definition

+ 2 - 2
reader.go

@@ -88,10 +88,10 @@ func (z *Reader) readHeader(first bool) error {
 	z.NoChecksum = b>>2&1 == 0
 
 	bmsID := buf[1] >> 4 & 0x7
-	bSize, ok := bsMapID[bmsID]
-	if !ok {
+	if bmsID < 4 || bmsID > 7 {
 		return fmt.Errorf("lz4: invalid block max size ID: %d", bmsID)
 	}
+	bSize := blockSizeIndexToValue(bmsID - 4)
 	z.BlockMaxSize = bSize
 
 	// Allocate the compressed/uncompressed buffers.