support uncompressed chunk format. close #220

This commit is contained in:
Tnze
2022-11-16 23:50:15 +08:00
parent 64667826d0
commit 7a2b3da584
3 changed files with 18 additions and 13 deletions

View File

@ -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 {

View File

@ -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
} }

View File

@ -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},