这个数是怎么计算出来的?--------关于自定义结构文件的长度计算,各位请帮忙看看.(100分)

  • 主题发起人 主题发起人 zssunway
  • 开始时间 开始时间
Z

zssunway

Unregistered / Unconfirmed
GUEST, unregistred user!
type<br> &nbsp;THeader=packed record<br> &nbsp; &nbsp;Flag:string[20]; &nbsp;[red]//长度是21[/red] &nbsp; <br> &nbsp; &nbsp;UserName:string[30]; //长度是31<br> &nbsp; &nbsp;LastModify:TDateTime; //长度是8<br> &nbsp; &nbsp;TableHeaderStart:Integer; //长度是4<br> &nbsp; &nbsp;TableHeaderEnd:Integer; &nbsp;//长度是4<br>end;<br>定义上面文件结构<br>var<br> &nbsp;a:THeader<br> &nbsp;为什么SizeOf(a)=68,为什么不是20+30+8+4+4=66,而实际为68?请各位帮忙解释一下.
 
长度是21、31<br>能只占20、30字节吗?<br>20、30字节能存放21、31长度吗?
 
string是从0开始的<br><br>string[20]是21个
 
哈哈。先从第一个开始吧,当你设定长度为20的时候还有一位是记录他们长度的一个字节就是20+1。。。。不信你试试,所以有的字符串当你设定他的长度的时候总要加1的。。。<br><br> &nbsp;嘿嘿。。。
 
很容易解释 ,68是4的倍数 .66不是.如果你想是66,可以这样设置,<br>在delphi菜单的project-&gt;options-&gt;compiler-&gt; record field alignment <br>你把这里设置成1,然后测试看看,应该就是你要的.
 
先谢谢各位<br>liuchong:可能我没说清楚我的意思,我在Flag后写&quot;//长度是21&quot;,意思是,我设定Flag的长度为20,但实际测出来的长度是21<br>zywcd:改为1后,测出来的结果一样,68!<br>0桁骀,一剑飘雪:你们两位说的,我不知哪位是正确,不过,我比较相信一剑飘雪的较有道理,各位还能再发表一下看法吗?
 
因为在网吧,所以不能测试,想知道谁的是正确的很简单的,只要去掉一个string再测试一下长度就知道了:)
 
搂主对记录后面的长度注释是正确的<br>字符串长度会比原来+1,因为第0个字节保存长度<br>如果想长度20,需要这样声明<br>UserName: array[0..29] of Char; <br><br>声明packed record后跟字节对其没有任何关系<br>所以不要追究68是不是4的倍数!
 
delphi中,string是特殊的类型,要当作数组形式看待,它从[0]开始计算,到[20]里面包含了21位的字符,如果要定义20位,则应该string[19]!
 
string[n]<br>是短字符串,短字符串其面有一个字节表示字符串长度的。所以长度总是N+1
 
多谢各位!
 
后退
顶部