关于 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 ...
随机推荐
- make menuconfig出错,需要安装libncurses5-dev找不到文件的终极解决办法(不必更换源,适用于ubuntu 32位平台)
make menuconfig 错误,显示有curse 字样的文件没有装.用apt-get install 找不到,网上其他的办法说是源的问题,所以又更新了一下源,但是还是不好用,网速慢,更新太慢. ...
- Jquery客户端校验——jquery.validate.js
jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证 ...
- Python中模块安装文件的创建及使用
在Python编程中,我们常常需要自己编写模块,当模块文件写好了,就需要创建安装文件,方便模块的发布. 此时,常用的方法,就是使用Python distutils(代表distribution uti ...
- JSON格式序列化与反序列化(List、XML)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- C#高级编程笔记 2016年10月26日 MVC入门 Controller
1.MVC的定义: Models: Classes that represent the data of the application and that use validation logi ...
- 用border-image实现波浪边框
border-image的介绍 http://www.w3school.com.cn/cssref/pr_border-image.asp 先看一个效果: http://www.w3school.co ...
- 不一样的dynamic解析json 万能方法
写过javascript的人都知道js解析json 1:(JSON) 字符串转换为对象. var str = '{"name":"lsw","hobb ...
- Uiautomator--断言的使用
一.断言函数的使用 1.用例结构: 自动化用例结构,一般可以分成一个用例集,然后用例集下面会有非常多的用例组成,我们可以从多个用例中抽出一些用例组成测试套件. 2.用例的标准结构: setUp:初始化 ...
- linux c/c++
string 字符串操作 操作数的都是 ( char * )型,操作数必须是指向字符串的指针("a"),不能是字符('a'),操作时不考虑末尾的'\0'. size_t strle ...
- js之iframe子页面与父页面通信
iframe子页面与父页面通信根据iframe中src属性是同域链接还是跨域链接,通信方式也不同. 一.同域下父子页面的通信 父页面parent.html <html> <head& ...