- 论坛徽章:
- 11
|
本帖最后由 zylthinking 于 2013-03-13 19:26 编辑
再看这个似乎有点意思的代码:
PAD_SIZE 返回 len + 0~3, 对 len 进行 4字节补齐; 然后 google 打算在后面的 padding 中填入不同的值来表示 padding 字节数, 然而他是这样 padding 的:
*reinterpret_cast<uint32_t*>(data+padded-4) &= mask[padded-len];
也就是说, data+padded-4 介于 data - 4 与 data - 1 之间, 也就是说, 无论如何, 所谓 padding 肯定是要与正常数据争夺至少一个字节的空间的; 我就不明白, 为什么到现在, 居然还没有机器出问题,
void* Parcel::writeInplace(size_t len)
{
const size_t padded = PAD_SIZE(len);
// sanity check for integer overflow
if (mDataPos+padded < mDataPos) {
return NULL;
}
if ((mDataPos+padded) <= mDataCapacity) {
restart_write:
//printf("Writing %ld bytes, padded to %ld\n", len, padded);
uint8_t* const data = mData+mDataPos;
// Need to pad at end?
if (padded != len) {
#if BYTE_ORDER == BIG_ENDIAN
static const uint32_t mask[4] = {
0x00000000, 0xffffff00, 0xffff0000, 0xff000000
};
#endif
#if BYTE_ORDER == LITTLE_ENDIAN
static const uint32_t mask[4] = {
0x00000000, 0x00ffffff, 0x0000ffff, 0x000000ff
};
#endif
//printf("Applying pad mask: %p to %p\n", (void*)mask[padded-len],
// *reinterpret_cast<void**>(data+padded-4));
*reinterpret_cast<uint32_t*>(data+padded-4) &= mask[padded-len];
}
finishWrite(padded);
return data;
}
status_t err = growData(padded);
if (err == NO_ERROR) goto restart_write;
return NULL;
}
这是调用的difang
status_t Parcel::write(const void* data, size_t len)
{
void* const d = writeInplace(len);
if (d) {
memcpy(d, data, len);
return NO_ERROR;
}
return mError;
} |
|