关于结构体与类型转换的一点小技巧
2009-01-10 19:48
405 查看
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} type {下面两个结构体的大小都是 4 字节, 相当于一个 Cardinal 或 Integer 或 DWORD 的大小} TMyByteStruct = record b1: Byte; b2: Byte; b3: Byte; b4: Byte; end; TMyWordStruct = record w1: Word; w2: Word; end; procedure TForm1.Button1Click(Sender: TObject); var ByteStruct: TMyByteStruct; num: Cardinal; begin {假如} ByteStruct.b1 := $A1; ByteStruct.b2 := $B2; ByteStruct.b3 := $C3; ByteStruct.b4 := $D4; {那么} num := Cardinal(ByteStruct); ShowMessageFmt('$%x', [num]); //$D4C3B2A1 end; procedure TForm1.Button2Click(Sender: TObject); var WordStruct: TMyWordStruct; num: Cardinal; begin {假如} WordStruct.w1 := $ABCD; WordStruct.w2 := $1234; {那么} num := Cardinal(WordStruct); ShowMessageFmt('$%x', [num]); //$1234ABCD end; procedure TForm1.Button3Click(Sender: TObject); var num: Cardinal; ByteStruct: TMyByteStruct; begin num := $ABCD1234; Cardinal(ByteStruct) := num; //ByteStruct := TMyByteStruct(num); {这同上一句} ShowMessageFmt('$%x', [ByteStruct.b1]); //$34 ShowMessageFmt('$%x', [ByteStruct.b2]); //$12 ShowMessageFmt('$%x', [ByteStruct.b3]); //$CD ShowMessageFmt('$%x', [ByteStruct.b4]); //$AB end; procedure TForm1.Button4Click(Sender: TObject); var num: Cardinal; WordStruct: TMyWordStruct; begin num := $ABCD1234; Cardinal(WordStruct) := num; //WordStruct := TMyWordStruct(num); {这同上一句} ShowMessageFmt('$%x', [WordStruct.w1]); //$1234 ShowMessageFmt('$%x', [WordStruct.w2]); //$ABCD end; procedure TForm1.Button5Click(Sender: TObject); var ByteStruct: TMyByteStruct; WordStruct: TMyWordStruct; begin WordStruct.w1 := $2211; WordStruct.w2 := $4433; Cardinal(ByteStruct) := Cardinal(WordStruct); //ByteStruct := TMyByteStruct(WordStruct); {这同上一句} ShowMessageFmt('$%x', [ByteStruct.b1]); //$11 ShowMessageFmt('$%x', [ByteStruct.b2]); //$22 ShowMessageFmt('$%x', [ByteStruct.b3]); //$33 ShowMessageFmt('$%x', [ByteStruct.b4]); //$44 end; end.
相关文章推荐
- 关于结构体指针类型转换的小结
- 【怎样写代码】小技巧 -- 关于引用类型的两种转换方式
- 关于泛型的一点应用(数值类型间的转换)
- 关于int型整数按逆序存入数组中的问题(也即十进制数和其他类型数据的转换问题)
- 关于C++中的类型转换
- 关于string类型的一个小技巧
- Java关于图片的切割、缩放、类型转换、水印、彩色转黑白处理
- 摘要:关于VC中的数据类型转换BSTR、char*和CString的深入研究。
- JS中的关于类型转换的性能优化
- 关于用标签判断转换过的日期类型
- golang基础-接口、接口嵌套、类型断言、接口与结构体_接口等转换
- 关于三元操作符操作数类型转换问题解析
- 关于C/C++结构体的一点知识
- 关于C++中的类型转换
- 关于字符和数字类型的索引,Oracle如何实现内部自动转换以及索引使用的验证测试
- Asp.net 2.0 关于Header/title/Meta tages/Style操作的一点小技巧
- 关于C++中类类型转换操作符总结
- VBS数据类型转换小技巧
- 关于指针强制类型转换的思考
- 关于java将String类型的时间字符串转换为Date类型的问题