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

[] big endian 与 little endian之间的转换

2013-04-21 
[求助] big endian 与 little endian之间的转换ptr是指向需要转换对象的指针,size是该对象所占的byte数。#i

[求助] big endian 与 little endian之间的转换

ptr是指向需要转换对象的指针,size是该对象所占的byte数。


#include <stdio.h>

void *ConvertEndian(void *ptr, size_t size)
{
   char *head = (char *)ptr;
   char *tail = head + size -1;
   char temp;
   
   for(; tail > head; tail--, head++)
   {
      temp = *head;
      *head = *tail;
      *tail = temp;
   }
}

[解决办法]
看起来没什么问题,可以参考strrev函数的写法:

    char* strrev(char* s)  
    {  
        /* h指向s的头部 */  
        char* h = s;      
        char* t = s;  
        char ch;  
      
        /* t指向s的尾部 */  
        while(*t++){};  
        t--;    /* 与t++抵消 */  
        t--;    /* 回跳过结束符'\0' */  
      
        /* 当h和t未重合时,交换它们所指向的字符 */  
        while(h < t)  
        {  
            ch = *h;  
            *h++ = *t;    /* h向尾部移动 */  
            *t-- = ch;    /* t向头部移动 */  
        }  
      
        return(s);  
    }  

[解决办法]
你弄错了,这个是颠倒字符串的。big endian和little endian的顺序区别是在字或者双字内的。整体的顺序还是正序的。
最简单的方式是用WinSock里的工具函数:
http://msdn.microsoft.com/en-us/library/aa271863.aspx

[解决办法]
void swap_byte_order(void *buf,int bytes) {
 unsigned char t,*b=(unsigned char *)buf;
 for (int i=0;i<bytes/2;i++) {
  t=b[i];
  b[i]=b[bytes-1-i];
  b[bytes-1-i]=t;
 }
}
short s;int k;long L;
swap_byte_order(&s,sizeof(s));
swap_byte_order(&k,sizeof(k));
swap_byte_order(&L,sizeof(L));


[解决办法]
看了下,基本没什么问题,LZ怎么调用的?
另外void * ConvertEndian中的*没什么必要,如果要记得要返回值。

# include <stdio.h>

void ConvertEndian(void * ptr, size_t size)
{
   char * head = (char *)ptr;
   char * tail = head + size - 1;
   char temp;

   for( ; tail > head; tail--, head++)
   {
      temp = *head;
      *head = *tail;
      *tail = temp;
   }
}

int main()
{
    short a = 0x1234;
    int b = 0x12345678;
    ConvertEndian(&a, sizeof(a));
    ConvertEndian(&b, sizeof(b));
    printf("%hx\n", a);
    printf("%x\n", b);

    return 0;
}

热点排行