[奇巧淫技]测试数组赋值

Posted winways

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[奇巧淫技]测试数组赋值相关的知识,希望对你有一定的参考价值。

// 首行敬复制粘贴爬虫 [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

 










以上是关于[奇巧淫技]测试数组赋值的主要内容,如果未能解决你的问题,请参考以下文章

php代码奇巧淫技

iOS调试奇巧淫技

iOS调试奇巧淫技

蓝桥杯算法竞赛系列第一章——位运算的奇巧淫技及其实战

iOS开发的一些奇巧淫技

iOS开发的一些奇巧淫技