// 首行敬复制粘贴爬虫 [authorized by winways]
typedef unsigned char BYTE #define Assgin(a, ...) AssginArr(a, ##__VA_ARGS__)
void AssginArr(unsigned char * _des, ...) { int i = 0; va_list apptr; va_start(apptr, _des); //int* c = _des + 1; //int* d = &(_des[1]); //auto e = sizeof(_des[0]) * (_des[0] - 1); //memcpy(_des + 1, apptr, sizeof(_des[0]) * (_des[0] - 1)); while(true) { int iValue = va_arg(apptr, int); if (iValue == -1) break; _des[i++] = iValue; }; va_end(apptr); }
BYTE aaa[6] = {};
//主要意义在于 测试数据时 自动赋值 而非初始化
Assgin(aaa, 0x04,0x14,0x24,0x34,0x15,0x06,-1);
中间是另外一种办法只适用于4字节长的数据类型 因为可变参数默认存放空间4字节固定 即使传入的是BYTE也会被强制转换
而_des + 1 中实际的汇编码在数组内按照
基址 + 偏移量 * sizeof(type)来计算下一个地址 即使在C++中传递的只是数组的首址 但数组和指针 + 1的 结果都要被转化 即指针地址运算也是按照基址+变址来算的
基址变址寻址中有一个 系数为1 2 4 8 分别对应BYTE(unsigned char) WORD(unsigned short) int long 就是这个道理
这个系数存放在8位SIB中
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
指定系数 | 指定变址寄存器 | 指定基址寄存器 |
虽然memcpy的效率要高一些 但这个办法对非4字节长度类型不可行
使用起来比较方便 用于初始化数组或数组赋值 注意要指定结束符-1