torch::Data Bz2::Decompress(const torch::Data &data) { const int size100k = 100000; int bufsize = size100k * Bz2::block100k; int status = 0; bz_stream stream = {0}; Data buf(bufsize); Data dst; dst.HiddenAlloc(data.GetSize() * 2); /* next_in should point at the data to be compressed * avail_in should indicate how many bytes the library may read * BZ2_bzDecompress updates next_in, avail_in and total_in to reflect the number of bytes it has read */ stream.next_in = (char*) data.GetBytes(); stream.avail_in = (int)data.GetSize(); /* next_out should point to a buffer in which the compressed data is to be placed * avail_out indicating how much output space is available. * BZ2_bzDecompress updates next_out, avail_out and total_out to reflect the number of bytes output. */ stream.next_out = (char*)buf.GetBytes(); stream.avail_out = (int)buf.GetSize(); status = BZ2_bzDecompressInit(&stream, 0, 0); if (status != BZ_OK) { BZ2_bzDecompressEnd(&stream); return dst; } do { status = BZ2_bzDecompress(&stream); if (status != BZ_OK && status != BZ_STREAM_END) break; dst.Append(buf.GetBytes(), bufsize - stream.avail_out); stream.next_out = (char*)buf.GetBytes(); stream.avail_out = (int)buf.GetSize(); }while (status != BZ_STREAM_END); BZ2_bzDecompressEnd(&stream); return dst; }
bool torch_data() { using namespace torch; std::string respath = Path(projectdir).Append("/tests/res").GetPath(); std::string testpath = Path(respath).Append("test.go").GetPath(); // torch::Data d = torch::File::GetBytes(testpath); // InfoLog("%s\n", d.ToString().c_str()); Data buf; int count = 0; // Fill buf.Fill(0, 1); buf.Fill(1, 2, 0); buf.DumpHex(); buf.Free(); // Alloc buf.Alloc(sizeof("hello,world")); if ( buf.GetSize() != 12 ) return false; buf.Free(); if ( buf.GetSize() != 0 ) return false; printf("[%d] %zu\n", ++count, buf.GetSize()); char *ptr = "hello,world"; size_t size = (strlen(ptr)+1) * sizeof(char); buf.Alloc( size ); // CopyFrom buf.CopyFrom(ptr, size); ((char *)buf.GetBytes())[5] = '|'; printf("print string: %s\n", buf.ToString().c_str()); // Insert echo("[Insert] Free"); buf.Free(); buf.DumpHex(); buf.Free(); echo ("[Insert] Insert \"\\1\\2\\3\\4\\5\\6\\7\" -> 0xff(3)"); char s1[] = "\1\2\3\4\5\6\7"; buf.Insert(0, s1, sizeof(s1)); buf.DumpHex(); buf.DumpBinary(); buf.DumpBinary(1); buf.DumpBinary(2); if (buf.ToHex() != std::string("0102030405060700")) return false; if (buf.ToBinary(1) != std::string("00000001 00000010 00000011 00000100 00000101 00000110 00000111 00000000")) return false; if (buf.ToBinary(2) != std::string("0000000100000010 0000001100000100 0000010100000110 0000011100000000")) return false; if (buf.ToBinary() != std::string("0000000100000010000000110000010000000101000001100000011100000000")) return false; { Data b = buf; b.DumpHex(); b.Insert(-1, 0xff); b.DumpHex(); if (b.ToHex() != "01020304050607FF00") return false; } { char str[] = "hello,world"; Data b; b.Insert(0, str, sizeof(str)); printf("%s\n", b.GetBytes()); } buf.Insert(3, 0xff); buf.DumpHex(); if (buf.ToHex() != "010203FF0405060700") return false; buf.Free(); char ss[] = "hello,world"; buf.Insert(0, ss, sizeof(ss)); printf("%s\n", buf.GetBytes()); if (std::string("hello,world") != (char*)buf.GetBytes()) return false; buf.Insert(3, '|'); printf("%s\n", buf.GetBytes()); if (std::string("hel|lo,world") != (char*)buf.GetBytes()) return false; // Append echo ("[Append] Append \\0"); buf.Free(); buf.Append('\0'); if (buf.ToHex() != "00") return false; buf.DumpHex(); echo ("[Append] Append \"\\1\\2\\3\\4\\5\\6\\7\""); buf.Append(s1, sizeof(s1)); if (buf.ToHex() != "000102030405060700") return false; buf.DumpHex(); Data b; b.Append((void*)"\0\0", 2); buf.Append(b); if (buf.ToHex(2) != "0001 0203 0405 0607 0000 00") return false; buf.DumpHex(2); // Erase buf.Free().Append(s1, sizeof(s1)); buf.DumpHex(); echo ("[Erase] Erase byte"); buf.Erase(buf.GetSize()-1, 1); if (buf.ToHex(2) != "0102 0304 0506 07") return false; buf.DumpHex(2); echo ("[Erase] Erase first byte"); buf.Erase(0, 1); if (buf.ToHex(2) != "0203 0405 0607") return false; buf.DumpHex(2); echo ("[Erase] Erase mid byets..."); buf.Erase(3, 10); if (buf.ToHex(2) != "0203 04") return false; buf.DumpHex(2); echo ("[Erase] Erase all..."); buf.Erase(0, 100); if (buf.ToHex() != "") return false; buf.DumpHex(); // Replace buf.Free(); echo ("[Replace]"); buf.Insert(0, s1, sizeof(s1)); buf.DumpHex(); echo ("[Replace] 0x00(0-1)"); buf.Replace(0, 1, 0x00); if (buf.ToHex(2) != "0002 0304 0506 0700") return false; buf.DumpHex(2); echo ("[Replace] 0x00(4-2)"); buf.Replace(4, 2, 0x00); if (buf.ToHex(2) != "0002 0304 0007 00") return false; buf.DumpHex(2); echo ("[Replace] 0x00(4-100)"); buf.Replace(4, 100, 0x00); if (buf.ToHex(2) != "0002 0304 00") return false; buf.DumpHex(2); echo ("[Replace] 0x00(0-100)"); buf.Replace(0, 100, 0x00); if (buf.ToHex(2) != "00") return false; buf.DumpHex(2); { Data d = buf; echo ("[Replace] 0x00(0-100)"); d.Replace(-1, 1, 0x11); if (d.ToHex() != "11") return false; d.DumpHex(); } // GetByte echo ("[GetBytes]"); char s3[] = "hello,world,luwei"; buf.Insert(0, s3, sizeof(s3)-1); buf.DumpHex(); #define TEST_BUFFER_PRINT_1(__CH, __CH2) \ printf("%02X => %c | %s\n", __CH, __CH, (__CH2==__CH)?"TRUE":"FALSE"); \ if (__CH2!=__CH) return false TEST_BUFFER_PRINT_1(buf.GetByte(0), 'h'); TEST_BUFFER_PRINT_1(buf.GetByte(1), 'e'); TEST_BUFFER_PRINT_1(buf.GetByte(2), 'l'); TEST_BUFFER_PRINT_1(buf.GetByte(-1), '\0'); TEST_BUFFER_PRINT_1(buf.GetByte(-2), 'i'); TEST_BUFFER_PRINT_1(buf.GetByte(-3), 'e'); TEST_BUFFER_PRINT_1(buf.GetByte(10), 'd'); TEST_BUFFER_PRINT_1(buf.GetByte(-10), 'r'); // Find buf.Free(); char s4[] = "hello,world,luwei"; buf.Insert(0, s4, sizeof(s4)); printf("[Find] %s\n", buf.GetBytes()); #define TEST_BUFFER_00(__ID, __CH, __INDEX, __D) \ int c##__ID = buf.IndexOf(__CH, __INDEX); \ printf("[Find] %d\n", c##__ID); \ if (c##__ID != __D) return false // Find-char TEST_BUFFER_00(0, 'i', -2, 16); TEST_BUFFER_00(1, 'o', 5, 7); TEST_BUFFER_00(2, 'o', 4, 4); TEST_BUFFER_00(3, 'o', -(int)buf.GetSize(), 4); TEST_BUFFER_00(4, '\0', -1, 17); TEST_BUFFER_00(5, '\0', 0, 17); TEST_BUFFER_00(6, '\0', (int)buf.GetSize()-1, 17); // FindLast // char s4[] = "hello,world,luwei"; #define TEST_BUFFER_01(__ID, __CH, __INDEX, __D) \ int c##__ID = buf.LastIndexOf(__CH, __INDEX); \ printf("[FindLast] %d\n", c##__ID); \ if (c##__ID != __D) return false TEST_BUFFER_01(7, 'i', -2, 16); TEST_BUFFER_01(8, 'o', 5, 4); TEST_BUFFER_01(9, 'o', -(int)buf.GetSize(), -1); TEST_BUFFER_01(10, '\0', -1, 17); TEST_BUFFER_01(11, '\0', 0, -1); TEST_BUFFER_01(12, '\0', (int)buf.GetSize()-1, 17); return true; }