chromium之pickle
pickle谷歌翻译成泡菜
醉了,看一下头文件的说明
// This class provides facilities for basic binary value packing and unpacking.
献丑一下翻译一下:此类提供基本的二进制打包、解包的功能。
看一下头文件提供的函数
class Pickle { public: virtual ~Pickle(); // Initialize a Pickle object using the default header size. Pickle(); // Initialize a Pickle object with the specified header size in bytes, which // must be greater-than-or-equal-to sizeof(Pickle::Header). The header size // will be rounded up to ensure that the header size is 32bit-aligned. explicit Pickle(int header_size); // Initializes a Pickle from a const block of data. The data is not copied; // instead the data is merely referenced by this Pickle. Only const methods // should be used on the Pickle when initialized this way. The header // padding size is deduced from the data length. Pickle(const char* data, int data_len); // Initializes a Pickle as a deep copy of another Pickle. Pickle(const Pickle& other); // Performs a deep copy. Pickle& operator=(const Pickle& other); // Returns the size of the Pickle's data. int size() const { return static_cast<int>(header_size_ + header_->payload_size); } // Returns the data for this Pickle. const void* data() const { return header_; } // Methods for reading the payload of the Pickle. To read from the start of // the Pickle, initialize *iter to NULL. If successful, these methods return // true. Otherwise, false is returned to indicate that the result could not // be extracted. bool ReadBool(void** iter, bool* result) const; bool ReadInt(void** iter, int* result) const; bool ReadLong(void** iter, long* result) const; bool ReadSize(void** iter, size_t* result) const; bool ReadUInt32(void** iter, uint32* result) const; bool ReadInt64(void** iter, int64* result) const; bool ReadIntPtr(void** iter, intptr_t* result) const; bool ReadString(void** iter, std::string* result) const; bool ReadWString(void** iter, std::wstring* result) const; bool ReadString16(void** iter, string16* result) const; bool ReadData(void** iter, const char** data, int* length) const; bool ReadBytes(void** iter, const char** data, int length) const; // Safer version of ReadInt() checks for the result not being negative. // Use it for reading the object sizes. bool ReadLength(void** iter, int* result) const; // Methods for adding to the payload of the Pickle. These values are // appended to the end of the Pickle's payload. When reading values from a // Pickle, it is important to read them in the order in which they were added // to the Pickle. bool WriteBool(bool value) { return WriteInt(value ? 1 : 0); } bool WriteInt(int value) { return WriteBytes(&value, sizeof(value)); } bool WriteLong(long value) { return WriteBytes(&value, sizeof(value)); } bool WriteSize(size_t value) { return WriteBytes(&value, sizeof(value)); } bool WriteUInt32(uint32 value) { return WriteBytes(&value, sizeof(value)); } bool WriteInt64(int64 value) { return WriteBytes(&value, sizeof(value)); } bool WriteIntPtr(intptr_t value) { return WriteBytes(&value, sizeof(value)); } bool WriteString(const std::string& value); bool WriteWString(const std::wstring& value); bool WriteString16(const string16& value); bool WriteData(const char* data, int length); bool WriteBytes(const void* data, int data_len); // ..... };
再瞄一下测试用例,这样这个类是干嘛的,就心里有数了
const int testint = 2093847192; const std::string teststr("Hello world"); // note non-aligned string length const std::wstring testwstr(L"Hello, world"); const char testdata[] = "AAA\0BBB\0"; const int testdatalen = arraysize(testdata) - 1; const bool testbool1 = false; const bool testbool2 = true; // checks that the result void VerifyResult(const Pickle& pickle) { void* iter = NULL; int outint; EXPECT_TRUE(pickle.ReadInt(&iter, &outint)); EXPECT_EQ(testint, outint); std::string outstr; EXPECT_TRUE(pickle.ReadString(&iter, &outstr)); EXPECT_EQ(teststr, outstr); std::wstring outwstr; EXPECT_TRUE(pickle.ReadWString(&iter, &outwstr)); EXPECT_EQ(testwstr, outwstr); bool outbool; EXPECT_TRUE(pickle.ReadBool(&iter, &outbool)); EXPECT_EQ(testbool1, outbool); EXPECT_TRUE(pickle.ReadBool(&iter, &outbool)); EXPECT_EQ(testbool2, outbool); const char* outdata; int outdatalen; EXPECT_TRUE(pickle.ReadData(&iter, &outdata, &outdatalen)); EXPECT_EQ(testdatalen, outdatalen); EXPECT_EQ(memcmp(testdata, outdata, outdatalen), 0); EXPECT_TRUE(pickle.ReadData(&iter, &outdata, &outdatalen)); EXPECT_EQ(testdatalen, outdatalen); EXPECT_EQ(memcmp(testdata, outdata, outdatalen), 0); // reads past the end should fail EXPECT_FALSE(pickle.ReadInt(&iter, &outint)); } } // namespace TEST(PickleTest, EncodeDecode) { Pickle pickle; EXPECT_TRUE(pickle.WriteInt(testint)); EXPECT_TRUE(pickle.WriteString(teststr)); EXPECT_TRUE(pickle.WriteWString(testwstr)); EXPECT_TRUE(pickle.WriteBool(testbool1)); EXPECT_TRUE(pickle.WriteBool(testbool2)); EXPECT_TRUE(pickle.WriteData(testdata, testdatalen)); // Over allocate BeginWriteData so we can test TrimWriteData. char* dest = pickle.BeginWriteData(testdatalen + 100); EXPECT_TRUE(dest); memcpy(dest, testdata, testdatalen); pickle.TrimWriteData(testdatalen); VerifyResult(pickle); // test copy constructor Pickle pickle2(pickle); VerifyResult(pickle2); // test operator= Pickle pickle3; pickle3 = pickle; VerifyResult(pickle3); }