support uncompressed chunk format. close #220
This commit is contained in:
@ -65,6 +65,8 @@ func (c *Chunk) Load(data []byte) (err error) {
|
|||||||
r, err = gzip.NewReader(r)
|
r, err = gzip.NewReader(r)
|
||||||
case 2:
|
case 2:
|
||||||
r, err = zlib.NewReader(r)
|
r, err = zlib.NewReader(r)
|
||||||
|
case 3:
|
||||||
|
// none compression
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -129,34 +129,37 @@ func (r *Region) Close() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func sectorLoc(offset int32) (sec, num int32) {
|
func sectorLoc(offset int32) (sec, num int32) {
|
||||||
return offset >> 8, offset & 0xFF
|
return (offset >> 8) & 0xFFFFFF, offset & 0xFF
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadSector find and read the Chunk data from region
|
// ReadSector find and read the Chunk data from region
|
||||||
func (r *Region) ReadSector(x, z int) (data []byte, err error) {
|
func (r *Region) ReadSector(x, z int) (data []byte, err error) {
|
||||||
offset, _ := sectorLoc(r.offsets[z][x])
|
sec, num := sectorLoc(r.offsets[z][x])
|
||||||
|
if sec == 0 {
|
||||||
if offset == 0 {
|
|
||||||
return nil, errors.New("sector not exist")
|
return nil, errors.New("sector not exist")
|
||||||
}
|
}
|
||||||
|
_, err = r.f.Seek(4096*int64(sec), 0)
|
||||||
_, err = r.f.Seek(4096*int64(offset), 0)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
reader := io.LimitReader(r.f, 4096*int64(num))
|
||||||
|
|
||||||
var length int32
|
var length int32
|
||||||
err = binary.Read(r.f, binary.BigEndian, &length)
|
err = binary.Read(reader, binary.BigEndian, &length)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if length == 0 {
|
||||||
if length < 0 || length > 1024*1024 {
|
return nil, errors.New("data is missing")
|
||||||
err = errors.New("data too large")
|
}
|
||||||
return
|
if length < 0 {
|
||||||
|
return nil, errors.New("declared length of data is negative")
|
||||||
|
}
|
||||||
|
if length > 4096*num {
|
||||||
|
return nil, errors.New("data too large")
|
||||||
}
|
}
|
||||||
data = make([]byte, length)
|
data = make([]byte, length)
|
||||||
_, err = io.ReadFull(r.f, data)
|
_, err = io.ReadFull(reader, data)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -120,7 +120,7 @@ func TestWriteSectors(t *testing.T) {
|
|||||||
|
|
||||||
expectedSectorsNum := 2
|
expectedSectorsNum := 2
|
||||||
for idx, test := range []struct{ size, sectors int }{
|
for idx, test := range []struct{ size, sectors int }{
|
||||||
{0, 1},
|
{1, 1},
|
||||||
{1000, 1},
|
{1000, 1},
|
||||||
{4091, 1},
|
{4091, 1},
|
||||||
{4092, 1},
|
{4092, 1},
|
||||||
|
Reference in New Issue
Block a user