delphi中将 4 个 Byte 合成 1 个 Integer 的五种方法

有4个字节类型的值,用移位或逻辑运算符怎么合成一个整数?
比如 $FFEEDDCC。

$FF
$EE
$DD
$CC


//方法 1: 共用内存procedure TForm1.Button1Click(Sender: TObject);varbf: record b1,b2,b3,b4: Byte end;

i: Integer absolute bf;beginbf.b1 := $CC;

bf.b2 := $DD;

bf.b3 := $EE;

bf.b4 := $FF;

ShowMessageFmt(‘%x‘, [i]);

//FFEEDDCC
end;//方法 2: 位运算procedure TForm1.Button2Click(Sender: TObject);vari: Integer;begini := $CC or ($DD shl 8) or ($EE shl 16) or ($FF shl 24);//不用括号也可ShowMessageFmt(‘%x‘, [i]);

//FFEEDDCC
end;//方法 3: 使用函数procedure TForm1.Button3Click(Sender: TObject);vari: Integer;begini := MakeLong(MakeWord($CC,$DD),MakeWord($EE,$FF));

ShowMessageFmt(‘%x‘, [i]);

//FFEEDDCCend;//方法 4: 从静态数组...procedure TForm1.Button4Click(Sender: TObject);varbs: array[0..3] of Byte;

P: PInteger;beginbs[0] := $CC;

bs[1] := $DD;

bs[2] := $EE;

bs[3] := $FF;

P := @bs;

ShowMessageFmt(‘%x‘, [P^]);

//FFEEDDCC
end;//方法 5: 从动态数组...procedure TForm1.Button5Click(Sender: TObject);varbs: array of Byte;

P: PInteger;beginSetLength(bs, 4);

bs[0] := $CC;

bs[1] := $DD;

bs[2] := $EE;

bs[3] := $FF;

P := @bs[0];

ShowMessageFmt(‘%x‘, [P^]);

//FFEEDDC
Cend;
-------------------------------------------------------------------------------
1.可以直接Copymemory或者Move
2.可以用变体类型的结构体.
type
   TWordOfInt = array[0..2-1] of WORD;
   TByteOfInt = array[0..4-1] of Byte;
   TIntRec = packed record //定义一个辅助类型,这样转换非常快,而且方便
     case Integer of
       0: (IntValue: Integer);
       1: (Low, High: Word);
       2: (Words: TWordOfInt);
       3: (Bytes: TByteOfInt);
   end;

//方法一,借助TIntRec,来转换
var
   Int : Integer;
   Bytes : TByteOfInt;
begin
   int := 100;

Bytes := TIntRec(int).Bytes;//integer转字节数组
   Int :=  TIntRec(Bytes).IntValue; //Byte数组转Integer

end;

//方法二, 直接用TIntRec,不转换.根本不耗费一点点CPU的时间
var
   value : TIntRec;
begin
   value.IntValue := 100; //看成Integer
   //下面是看成Byte数组用
   value.Bytes[0] := 1;
   value.Bytes[1] := 1;
   value.Bytes[2] := 1;
   value.Bytes[3] := 1;
end;

http://w-tingsheng.blog.163.com/blog/static/2505603420122643224621/

时间: 2024-10-02 21:54:32

delphi中将 4 个 Byte 合成 1 个 Integer 的五种方法的相关文章

ASP.NET MVC 中将数据从View传递到控制器中的三种方法(表单数据绑定)

转自:http://www.cnblogs.com/zyqgold/archive/2010/11/22/1884779.html 在ASP.NET MVC框架中,将视图中的数据传递到控制器中,主要通过发送表单实现的.具体使用中,主要使用以下三种方法. 1.通过Request.Form读取表单数据        2.通过FormCollection读取表单数据        3.直接读取表单数据对象 下边是我学习这些东西时的一点总结 1.通过Request.Form读取表单数据      首先定

pentaho中Invalid byte 3 of 3-byte UTF-8 sequence的解决方法

今天在创建数据源的时候报了这么一个错 Invalid byte 3 of 3-byte UTF-8 sequence. 上网一查,说是有中文,字体不相符,可是我没有写中文,为了能继续往后进行,修改了如下文件 在start-pentaho.bat中添加了一句代码 修改前 IF "%BITS%" == "64" ( set CATALINA_OPTS=-Xms1024m -Xmx2048m -XX:MaxPermSize=256m -Dsun.rmi.dgc.clien

【转】delphi程序只允许运行一个实例的三种方法:

一.        创建互斥对象 在工程project1.dpr中创建互斥对象 Program project1 Uses Windows,Form, FrmMain in 'FrmMain.pas' {MainForm}; {$R *.res} var hAppMutex: THandle; //声明互斥变量 begin hAppMutex := CreateMutex(nil, false,’projectname’); //创建互斥对象projectname工程名称 if ( (hAppM

让程序只运行一个实例(Delphi篇)(三种方法,其中使用全局原子的方法比较有意思)

Windows 下一个典型的特征就是多任务,我们可以同时打开多个窗口进行操作,也可以同时运行程序的多个实例,比如可以打开许多个资源管理器进行文件的移动复制操作.但有时出于某种考虑(比如安全性),我们要做出一些限制,让程序只能够运行一个实例.在Delphi编程中,笔者总结出了以下几种方法: 一. 查找窗口法 这是最为简单的一种方法.在程序运行前用FindWindow函数查找具有相同窗口类名和标题的窗口,如果找到了,就说明已经存在一个实例.在项目源文件的初始化部分添加以下代码: [delphi] v

[转]Delphi调用cmd的两种方法

delphi调用cmd的两种方法vars:string;begins:='cmd.exe /c '+edit1.Text+' >c:\1.txt';winexec(pchar(s),sw_hide);sleep(2000);memo1.Lines.LoadFromFile('c:\1.txt'); 2shellexecute(handle,nil,'cmd.exe',pchar(form2.edit1.text),nil,sw_hide);WinExec主要运行EXE文件.如:WinExec(’

Delphi 导出数据至Excel的7种方法【转】

转自:http://blog.csdn.net/zang141588761/article/details/52275948 一; delphi 快速导出excel uses ComObj,clipbrd; function ToExcel(sfilename:string; ADOQuery:TADOQuery):boolean; const xlNormal=-4143; var y : integer; tsList : TStringList; s,filename :string; a

Mac OS X+AspectJ+JDK 8,报Invalid byte tag in constant pool: 18的解决方法

这个问题也挺让人无语的,昨天重新装了Mac OS X,然后装JDK,想都没想就装了JDK 8,然后开始实验,结果就报类似于下面这种Exception: org.aspectj.apache.bcel.classfile.ClassFormatException: File: 'java.util.Comparator': Invalid byte tag in constant pool: 18 看了一下,觉得像是JDK版本引起的问题,所以就想换成JDK 7,这里简单说说怎么在Mac OS X中

asp.net中c# byte[] 转换为 IntPtr几种方法

有几种方法可以访问与字节数组相对应的 IntPtr. 第一种,使用不安全的代码块来访问直接指向字节数组的指针.  代码如下 复制代码 unsafe { byte[] test = new byte[5]; fixed (byte* p = &test[0]) { *p = 0xff; } } 第二种,可以使用 GCHandle 来获得对象.  代码如下 复制代码 using System.Runtime.InteropServices; byte[] test = new byte[5]; GC

Delphi获取其它进程窗口句柄的3种方法

本文主要跟大家介绍Delphi中获取其它进程的窗口句柄,在Delphi中获取其它进程的窗口句柄,绝大部分人首先想到的会使用:FindWindow或者用GetWindow来遍历查找,如: handle := FindWindow(nil,PChar('窗口的标题')); 或者: procedure TForm1.Button1Click(Sender: TObject); var hCurrentWindow: HWnd; WndText:String; begin hCurrentWindow