CAPL内置的与Struct Byte有关函数
在CAPL中我们要经常和Struct Byte 打交道,为了方便的写CAPL脚本,所以我整理了Vector官方提供的与Struct Byte有关的函数,并对常用的进行简单说明。
本文大部分摘录自Vector的官方文档,做了整理与翻译,增加了自己的理解, 并将代码改造的更加优雅实用一些。
一、CAPL中与Struct Byte有关的函数
Windows和Linux支持这些CAPL功能。Linux下的功能尚未经过全面测试。
Functions | Short Description |
---|---|
memcmp |
比较入参中的字节(bytes) 数据 |
memcpy |
将字节(bytes) 从源复制到目标 |
memcpy_h2n |
将字节(bytes) 从结构(struct) 复制到数组(array) 中 |
memcpy_n2h |
用数组(array) 中的字节(bytes) 填充结构(struct) |
memcpy_off |
将字节(bytes) 从源复制到目标,并给出目标起始偏移量 |
为了便于理解本文中的示例代码,所以需要提前知道下面的知识:
DWORD
就是 Double Word, 每个word为2个字节的长度; DWORD双字即为4个字节,每个字节是8位,共32位 。- 小端(Little Endian) 模式 是嵌入式领域经常用到的排序方式, 特征为: 低位字节排放在内存的低地址端,高位字节排放在内存的高地址端
二、 Struct Byte操作: 比较多个字节
2.1 函数: memcmp()
函数语法
int memcmp(struct * dest, byte source[]); // form 1
int memcmp(byte dest[], struct * source); // form 2
int memcmp(struct * dest, struct * source); // form 3
int memcmp(byte dest[], byte source[], dword size); // form 4
函数功能描述
比较入参的字节数据。在格式3中,两个结构必须具有相同的类型。
函数参数介绍
参数 | 含义 |
---|---|
dest |
A struct |
source |
Another struct |
size |
Size of the arrays (number of bytes to compare). |
返回值介绍
如果字节(bytes) 相等,则为0;如果它们不相等,则为非0的值
举例说明
关于memcmp()
函数说明的示例代码:
on key 's'
{
byte data[4];
struct WrapDword
{
dword dw;
} dwordWrapper;
int i;
for (i = 0; i < elcount(data); ++i){
data[i] = i;
}
dwordWrapper.dw = 0x03020100;
if (memcmp(dwordWrapper, data) == 0){
write("Data represents the number: Little Endian is used.");
}
}
如果采用了小端(Little Endian)模式 (一般的主机都是小端模式), 输出结果:
Data represents the number: Little Endian is used.
三、 Struct Byte操作: 拷贝字节
在这一章节中,我们介绍四个函数:memcmp()
、 memcpy_n2h()
、 memcpy_n2h()
、 memcpy_off()
四个函数, 它们的功能非常相似, 而且都是从memcmp()
的功能上进行简单的变种。
3.1 函数: memcmp()
这个函数是最通用的拷贝字节函数,作用: 将字节(bytes) 从源复制到目标。
函数语法
void memcpy(byte dest[], struct * source); // form 1
void memcpy(char dest[