zoukankan      html  css  js  c++  java
  • 关于结构体与类型转换的一点小技巧


    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.
    
  • 相关阅读:
    Django各个文件中常见的模块导入
    js模板(template.js)实现页面动态渲染
    Netty 源码 Channel(一)概述
    Netty 源码 NioEventLoop(三)执行流程
    Netty 源码(一)Netty 组件简介
    Netty 源码(二)NioEventLoop 之 Channel 注册
    Java 算法(一)贪心算法
    Netty Reator(三)Reactor 模型
    Netty Reator(二)Scalable IO in Java
    Reactor 模型(一)基本并发编程模型
  • 原文地址:https://www.cnblogs.com/del/p/1373370.html
Copyright © 2011-2022 走看看