2011-11-02 122 views
0

考虑一个包含头后跟多个值的数据包。如果hdr指向数据包标头,并且lastValue指向数据包中的最后一个值。你能解释一下我下面的代码:C++计算大小

size_t calcSize = (lastValue - (char *)hdr); 

多大呢calcSize表示包。换句话说,这个尺寸正在考虑的开始和结束位置是什么。谢谢,

+0

“lastValue”的类型是什么? –

回答

2

calcSize将是数据包中的字节数。

+0

例如,如果lastValue =“结束”;让我们假设数据包的大小,直到最后一个值的起始字节为32为止。是否size_t calcSize =(lastValue - (char *)hdr);给出结果32 + 7 = 39个字节。我想知道它是否包含上述尺寸计算中最后一个值的所有字节。 –

+0

如果'lastValue'超过end_,算术会给你正确的答案,也就是说,如果它指向“结束”的终止nul字符。否则,你会在你的例子中得到32。 – Useless

+0

是的,如果你有STL“一个过去的末端方法”。如果没有,那么你需要添加1'size_t calcSize = 1 +(lastValue - (char *)hdr);' – Sean

0

这是指针算术:(lastValue - hdr)意味着两个字符指针之间的差异,这意味着它们之间的字符大小。

2

在这种情况下,这种算法没有多大意义。 这是因为包你最后的实体/值例如可以是32位(4字节),并从其减去指针从它的标题是没有意义的 - 最好是在你的减法包后使用指针的第一个字节

int packetLen = (char*)firstByteAfterPacketPtr - (char*)headerPtr; 

     7 8 9 10 11 12 13 14 15 16 17 <-- example byte index 
    +---+---+---+---+---+---+---+---+---+---+ 
... | header | v1 |v2 | value3  |...... 
    +---+---+---+---+---+---+---+---+---+---+ 
    ^     ^   ^
     headerPtr    lastValPtr  firstByteAfterPacketPtr 

你的算术会给:

int packetLen = (char*)lastVarPtr - (char*)headerPtr; // 13-7=6 wrong 

正确的是:

int packetLen = (char*)firstByteAfterPacketPtr - (char*)headerPtr; // 17-7=10 ok 

要小心指针运算 - 在(的char *)的情况下,你得到b yte的差异,如果指针指向16位实体,则会以16位实体的数量表示差异。

+0

+ +1为一个漂亮的图。 –