字节顺序问题求教
本帖最后由 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);
}
}