关于 Lo、Hi、LoWord、HiWord
Cardinal 是 4 字节无符号的整型, 先看一个例数:
Cardinal 例数: | 4277991664 | |||
---|---|---|---|---|
按字节划分: | 第四字节 | 第三字节 | 第二字节 | 第一字节 |
二进制: | 11111110 | 11111100 | 11111000 | 11110000 |
十六进制: | FE | FC | F8 | F0 |
十进制: | 254 | 252 | 248 | 240 |
按双字节划分: | 高两位 | 低两位 | ||
二进制: | 1111111011111100 | 1111100011110000 | ||
十六进制: | FEFC | F8F0 | ||
十进制: | 65276 | 63728 |
本话题会涉及到: Lo、Hi、HiByte、LoWord、HiWord、MakeWord、MakeLong、Int64Rec 譬如有一个 Cardinal 类型的整数:
其十六进制的表示是: $
其二进制表示是:
我们说 Cardinal 是 位的整数, 这里的位是指 "二进制的位数", 不信你数数. 我们需要重点面对的是十六进制, 不管是几进制的数在编译成汇编代码时都是用十六进制表示, 因为它最直观;
我们用十六进制来分析, 也是因为它的直观. 怎么直观的? Cardinal 有 位, 每 位一个字节, 共 个字节;
上面的例数分成字节就是: $、$、$、$, 这明显比二进制简洁、比十进制直观. 其中的 $ 是最低位的字节、$ 是最高位的字节(每字节对应十六进制的两位).
有时我们需要获取其中某个字节或某两个字节, 这虽然用位运算也不难, 但还是有了诸多函数: Lo //获取例数中的 $11
Hi //获取例数中的 $22
LoWord //获取例数中的 $2211
HiWord //获取例数中的 $4433 其中的 Hi 好像有点费解, 为什么获取的不是 $ 而是 $ 呢?
这样理解吧: Hi 获取的是 Lo(获取)的上一个字节. HiByte 和 Hi 基本一样, 如果参数是 位的 Word 类型, 用 HiByte 会更好些(中间会省去一个转换过程). 其中的 HiWord 是个函数, 但 LoWord 并不是个函数, 它是 Word 类型的重命名.
也就是说 LoWord(num) 等价于 Word(num), 这不是类型转换吗?
是的, 所以像 Lo(num) 也可以用 Byte(num) 来代替. 用代码总结一下: var
num: Cardinal;
b1,b2,b3,b4: Byte;
w1,w2: Word;
begin
num := $;
w1 := Word(num);
w2 := HiWord(num);
ShowMessageFmt('w1:%x; w2:%x', [w1,w2]);//w1:2211; w2:4433 b1 := Lo(num);
b2 := Hi(num);
b3 := Byte(w2);
b4 := HiByte(w2);
ShowMessageFmt('b1:%x; b2:%x; b3:%x; b4:%x', [b1,b2,b3,b4]);//b1:11; b2:22; b3:33; b4:44
end; 下一个话题: 我们有时也需要进行上面的反操作, 譬如:
把两个 Byte 合成为一个 Word;
把两个 Word 合成一个 Cardinal;
把两个 Cardinal 合成一个 Int64;
把四个 Byte 合成一个 Cardinal;
把四个 Word 合成一个 Int64 等等 上面说的 Cardinal 也可以是 Integer 或 DWORD. 完成这种工作也有不少函数:
MakeWord、MakeLong、MakeWParam、MakeLParam、MakeLResult、MAKELCID 等等. 仅就 MakeWord、MakeLong 举例: var
num: Cardinal;
b1,b2,b3,b4: Byte;
w1,w2: Word;
begin
b1 := $;
b2 := $;
b3 := $;
b4 := $; w1 := MakeWord(b1, b2);
w2 := MakeWord(b3, b4);
ShowMessageFmt('w1:%x; w2:%x', [w1,w2]);//w1:2211; w2:4433 num := MakeLong(w1, w2);
ShowMessageFmt('num:%x', [num]);//
end; 有没有把两个 Integer 合成为 Int64 的函数呢?
没有, 当然可以写一个; 不过有更方便的处理方式, 那就是 Int64Rec 结构. 举例如下: var
n1,n2: Cardinal;
num64: Int64;
rec: Int64Rec;
begin
n1 := $;
n2 := $AABBCCDD; rec.Lo := n1;
rec.Hi := n2; num64 := Int64(rec);
ShowMessage(IntToHex(num64, )); //AABBCCDD44332211
end; Int64Rec 更多用于反向操作: var
n1,n2: Cardinal;
num64: Int64;
begin
num64 := $AABBCCDD44332211; n1 := Int64Rec(num64).Lo; //或 n1 := Cardinal(num64);
n2 := Int64Rec(num64).Hi; ShowMessageFmt('n1:%x; n2:%x', [n1,n2]);//n1:44332211; n2:AABBCCDD
end;
关于 Lo、Hi、LoWord、HiWord的更多相关文章
- delphi 关于 "高位" 与 "低位"
Longint = Integer WPARAM = Integer LPARAM = Integer LRESULT = Integer FARPROC = Pointer function Mak ...
- GDI+ 笔记
1.GDI+模板 #include<windows.h> #include<GdiPlus.h> #include <time.h> #include <ma ...
- win32api 获取文件版本信息
#coding:utf-8 myPath="C:\\ime" import os from win32api import GetFileVersionInfo, LOWORD, ...
- windows API 开发飞机订票系统 图形化界面 (三)
来吧,接下来是各个功能的函数的实现代码. 首先,程序运行时加载读入账户信息和航班信息.接下来就该读取文件了. 我把账户资料和航班信息储存在了.txt文件里 那么问题就来了,挖掘机...额,不对,应该怎 ...
- SetCapture() & ReleaseCapture() 捕获窗口外的【松开左键事件】: WM_LBUTTONUP
今天在窗口上绘图的时候,遇到一个问题:在特殊情况下,当用户在窗口中按下鼠标左键,然后移动到窗口外松开鼠标左键,这时程序中只能捕获到 WM_LBUTTONDOWN(按下) 和 WM_MOUSEMOVE( ...
- 30. Substring with Concatenation of All Words
题目: You are given a string, s, and a list of words, words, that are all of the same length. Find all ...
- python获取文件属性
提供三段代码 1.os模块 import os def TestFileAttributes(): # This function is platform indepedent. statinfo = ...
- Lo、Hi、HiByte、LoWord、HiWord、MakeWord、MakeLong、Int64Rec
本话题会涉及到: Lo.Hi.HiByte.LoWord.HiWord.MakeWord.MakeLong.Int64Rec 譬如有一个 Cardinal 类型的整数: 1144201745其十六进制 ...
- HIWORD HIBYTE
#include "pch.h" #include <iostream> #include<Windows.h> int main() { ; WORD i ...
随机推荐
- php无限极分类以及递归(thinkphp)
php无限极分类: 无限极分类重点在于表的设计: 1在model中: class CatModel extends Model{ protected $cat = array(); public fu ...
- linux 安装maven
set maven environment M2_HOME=/tool/apache-maven-3.3.9export M2_HOME PATH=$PATH:$M2_HOME/bin expor ...
- Windows7安装 .net framework 4.0
1.首先下载安装包.net framework 4.0点击下载即可 2.安装,双击下载好的安装包
- visual stuido 跨解决方案调试
visual stuido 跨解决方案调试 一个解决方案是一个第三方库,另一个是单独的程序.调试的时候要同时跟踪源码.因为第三方库并没有直接使用它的源码,而是使用生成的dll,直接进行调试比较麻烦,会 ...
- 在桌面程序上和Metro/Modern/Windows store app的交互(相互打开,配置读取)
这个标题真是取得我都觉得蛋疼..微软改名狂魔搞得我都不知道要叫哪个好.. 这边记录一下自己的桌面程序跟windows store app交互的过程. 由于某些原因,微软的商店应用的安全沙箱导致很多事情 ...
- js之iframe子页面与父页面通信
iframe子页面与父页面通信根据iframe中src属性是同域链接还是跨域链接,通信方式也不同. 一.同域下父子页面的通信 父页面parent.html <html> <head& ...
- DateUtil(比较两个日期是否是同一天)
1.比较两个日期是否是同一天 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date la ...
- 【linux】scp命令
scp的作用是在不同主机之间传输文件. 用法: scp user@host:/path1 path2 说明: 把远程主机host中path1的内容拷贝到当前主机的path2 user是远程主机登陆用户 ...
- WinForm 遍历用户控件里CheckBox
1.常用调用方法 public partial class UCRights : UserControl { private readonly int LOCATIONY; private DataT ...
- 如何用qq代理发送邮件
今天我想写一篇服务器发送验证邮件的的文章,我查阅过其他博客里面写的文章,都是可以实现的,但是对于初学者来说是一个很痛苦的事情,很多代码看不懂,原因有多种,写的多,写的乱,然后就不想往下看了.我今天详细 ...