func decomp(decomp_buf, block *Block, in, out DuplexPipe, wg *sync.WaitGroup) { defer wg.Done() nBlocks := (in.FileSize / int64(in.BlockSize)) + 1 if block.BlockID < int(nBlocks)-1 { snappy.Decode(decomp_buf.Buf, block.Buf[:block.NBytes]) decomp_buf.BlockID = block.BlockID } else { decomp_buf.NBytes = block.NBytes decomp_buf.BlockID = block.BlockID copy(decomp_buf.Buf[:decomp_buf.NBytes], block.Buf) } in.Upstream <- block out.Downstream <- decomp_buf }
func main() { // open input file dataFile, err := os.Open(os.Args[1]) if err != nil { panic(err) } defer func() { if err := dataFile.Close(); err != nil { panic(err) } }() // open uncompressed file outFile, err := os.Create(os.Args[1] + ".ini") if err != nil { panic(err) } defer func() { if err := outFile.Close(); err != nil { panic(err) } }() f32s := make([]byte, 4) bytes := make([]byte, 1) dataFile.Seek(3, 0) dataFile.Read(bytes) type_size := int(bytes[0]) dataFile.Seek(8, 0) dataFile.Read(f32s) file_size := binary.LittleEndian.Uint32(f32s) dataFile.Seek(12, 0) dataFile.Read(f32s) block_size := binary.LittleEndian.Uint32(f32s) * kB nBlocks := (file_size / (block_size)) + 1 offsets := make([]byte, nBlocks*8) dataFile.Seek(20, 0) dataFile.Read(offsets) dbuf := make([]byte, block_size) for i := uint32(0); i < nBlocks-1; i++ { start := binary.LittleEndian.Uint32(offsets[i*8 : (i*8)+4]) size := binary.LittleEndian.Uint32(offsets[i*8+4 : (i*8)+8]) block := make([]byte, size) dataFile.Seek(int64(start), 0) dataFile.Read(block) d, _ := snappy.Decode(dbuf, block[:]) bufo := make([]byte, len(d)) for j := 0; j < type_size; j++ { for k := 0; k < int(block_size)/64; k++ { bufo[k*type_size+j] = d[k+(j*int(block_size)/type_size)] } } outFile.Write(bufo) } start := binary.LittleEndian.Uint32(offsets[(nBlocks-1)*8 : ((nBlocks-1)*8)+4]) size := binary.LittleEndian.Uint32(offsets[(nBlocks-1)*8+4 : ((nBlocks-1)*8)+8]) block := make([]byte, size) dataFile.Seek(int64(start), 0) dataFile.Read(block) outFile.Write(block) }