C/C++单元测试工具Visual Unit 4在线帮助


解决字节序大小端差异

    在各种体系的计算机中,通常采用的字节存储机制有两种:Big-Endian和Little-Endian,即大端模式和小端模式。Big-Endian:MSB(最高有效位)存放在最低端的地址上。Little-Endian:MSB存放在最高端的地址上。

    VU的运行环境,一般为小端模式,即测试代码按小端模式编译。如果产品代码的目标环境为大端模式,则在short、int、long、unsigned short、unsigned int、unsigned long等数字类型与char*, BYTE*互相转换时,存在大小端差异,影响测试结果,例如:

    unsigned int str_to_unit(char* str)
    {
        return *(unsigned int*)str;
    }

    在小端模式下,返回值为0x04030201,在大端模式下,返回值为0x01020304。

解决办法一(推荐)
    在编写产品代码时考虑大小端的可移植性,这种方法的好处是,为项目移植到小端系统提供了便利:

    1、定义大小端转换宏:
    #ifdef LITTLE_ENDIAN
    #define SWAP16(x) ((((x)& 0xFF00)>>8) | (((x) & 0x00FF)<<8))
    #define SWAP32(x) ((((x) & 0xFF000000)>>24) | (((x) & 0x00FF0000)>>8) |\
                         (((x) & 0x0000FF00)<<8 ) | (((x) & 0x000000FF)<<24) )
    #else
    #define SWAP16(x) (x)
    #define SWAP32(x) (x)
    #endif

   
2、在数字与字符串转换时,使用大小端转换宏,如:
    unsigned int str_to_unit(char* str)
    {
        return SWAP32(*(unsigned int*)str);
    }

    3、测试时定义编译条件LITTLE_ENDIAN:VU工程属性->高级->预处理选项,在预处理定义输入框中,加入LITTLE_ENDIAN,并在测试工程的Setting中加入同样的编译条件。

解决办法二
   
使用VU提供的字节序反转功能。如上例,在VU主界面左边,函数代码窗口选中“*(unsigned int*)str”(不包括行末的分号),右键菜单选择“字节序反转(32位)”,代码自动修改为:
   
    unsigned
int str_to_unit(char* str)
    {
        return _SWAP32_(*(unsigned int*)str);
    }

    重新执行测试,结果即可与目标环境一致。这种方式不会修改产品代码。如需取消反转,双击_SWAP32_。