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

请问大小端的有关问题

2012-02-27 
请教大小端的问题各位高手我要写一个函数将unsignedlonga从小端转换到大端,怎么写呀?谢谢呀[解决办法]什么

请教大小端的问题
各位高手我要写一个函数将unsigned   long   a从小端转换到大端,怎么写呀?谢谢呀

[解决办法]
什么意思啊?

[解决办法]
不太明白你的意思,小端大端本是表示数据在内存中的表示方式,应该不是我们自己可以改变的吧,
以下的一个程序输出一个数据在内存中的十六进制表示,可以确定到底是大端还是小端,也许对你有帮助.
#include <stdio.h>
void show(unsigned long a)
{int i;
unsigned char *p=(unsigned char *)&a;
for(i=0;i <sizeof(unsigned long);i++)
printf( "%.2x ",p[i]);
}
如果要反过来写,只需调整循环变量i即可.
[解决办法]
楼主的意思当然是从网络上接收到,或者从文件中读出了小端的数据,现在要转到大端,一下只是一个例子,真正使用的时候unsigned long可不好用,因为在不同的平台,不同的编译器,unsigned long 的长度是不同的,所以下面的程序在32位和64位系统中输出是不同的。建议用uint32_t之类的。
----------
#include <stdio.h>

unsigned long ulr(unsigned long ul_in)
{
typedef union _uc {
unsigned long u;
unsigned char c[sizeof(unsigned long)];
} uc;
size_t i, n;
volatile uc uc_out;
unsigned char c;

uc_out.u = ul_in;

n = sizeof(unsigned long);
for (i = 0; i < (n / 2); i++)
{
c = uc_out.c[i];
uc_out.c[i] = uc_out.c[n - 1 - i];
uc_out.c[n - 1 - i] = c;
}
return uc_out.u;
}

int main(void)
{
unsigned long i, j;

i = 0x1234ABCD;
j = ulr(i);

printf( " i = %016LX\n ", i);
printf( " j = %016LX\n ", j);

return 0;
}

[解决办法]
socket函数ntohl/htonl,现成的。

热点排行