首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

字节顺序有关问题求教

2013-09-12 
字节顺序问题求教本帖最后由 chn3698 于 2013-09-10 17:13:58 编辑最近学习C++的时候遇到了一个令人费解的

字节顺序问题求教
本帖最后由 chn3698 于 2013-09-10 17:13:58 编辑 最近学习C++的时候遇到了一个令人费解的问题,调用addBytes函数的时,给该函数传递了一个int类型的数值,定义如下:
int i = 16975631;//二进制:00000001 00000011 00000111 00001111
然后调用addBytes函数,函数定义如下:
//Mem.h
typedef unsigned char byte;
...
private:
byte* bytes;
...
//Mem.cpp
void Mem::addBytes(void* element,int sizeOfBytes)
{
//ensureSize(this->size + sizeOfBytes);//请忽略此行,该行用于给byte扩容
byte* e = (byte*)element;
for(int i = 0; i < sizeOfBytes; i++)
{
cout << (int)e[i] << endl;
this->bytes[i] = e[i];
}
}
但是,不知道因何原因,e[0]的二进制总是00001111,也就是原本i中的第四个字节的数据
表达的可能不清晰,烦请看懂的前辈们指点一二,谢谢
[解决办法]
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

[解决办法]
小端方式
int4个字节在内存中是低位在前,高位在后的。
[解决办法]
搜索大小端,如果你想跨平台,传入的时候要用char[4]而不是int
[解决办法]

void HexDump(char *buf,int len) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%04x -",i);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);


            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}


[解决办法]
如果程序只在一种平台运行,只需要那种平台的字节序就成.
如果跨平台,检测一下平台,做一下转换.

热点排行