如何在编译时取得系统的字节顺序!请指教!

huanyun 2006-08-28 04:24:15
最近学习加密
看见一段宏
估计是用来确定字节顺序的 但结果却是错误的

#define X_PLATFORM_LITTLE_ENDIAN 1234
#define X_PLATFORM_BIG_ENDIAN 4321

#if (('1234' >> 24 ) == '1')
#define X_PLATFORM_ENDIAN X_PLATFORM_LITTLE_ENDIAN
#elif (('1234' >> 24 ) == '4')
#define X_PLATFORM_ENDIAN X_PLATFORM_BIG_ENDIAN
#else
#error 字节顺序不是1234和4321
#endif

但是在AIX机器上得不到正确的结果
AIX机器是X_PLATFORM_BIG_ENDIAN 但(('1234' >> 24 ) == '1')成立

请问有正确的解决方案么?
...全文
323 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Snow_Ice11111 2006-10-04
  • 打赏
  • 举报
回复
共同体->联合体union
------------------------------
嘿嘿,我的叫法不太规范,大家见笑了^_^
Snow_Ice11111 2006-10-04
  • 打赏
  • 举报
回复
用含有long和char[4]或short和char[2]的共同体就很好判断了。
Tian_Dao_Akane 2006-10-04
  • 打赏
  • 举报
回复
Mark一下。另外弱弱地问一下楼上的豆腐(吃好睡好)朋友,不知怎样在这里申请、注册到中文ID的?
mynamelj 2006-09-23
  • 打赏
  • 举报
回复
判断 _UNICODE
xiaoshi0 2006-09-12
  • 打赏
  • 举报
回复
先把一个数存到内存中,比如:

short *p = new short;
*p = 0x1234;

然后将p转化成byte取出

BYTE b = *((PBYTE)p);

如果是34,则……

如果是12,则……

注:你的方法只是进行了一下逻辑运算,所以那个等式恒等
huanyun 2006-09-09
  • 打赏
  • 举报
回复
就是不知道用宏定义如何表达啊
如果用代码 这个更简洁
union {
int32 i;
char c[4];
} u;
u.i = 1;
bigendian = u.c[0] == 0;
jixingzhong 2006-09-03
  • 打赏
  • 举报
回复
#include <stdio.h>
main () {
int i = 0x12345678;
if (*(char *)&i == 0x12)
printf ("Big endian\n");
else if (*(char *)&i == 0x78)
printf ("Little endian\n");
}

把这个改成宏定义方式应该可以
superarhow 2006-08-29
  • 打赏
  • 举报
回复
这样行不行:
#if L'\x102' >> 8 == 1
#define LITTLE_ENDIAN
#elif L'\x102' >> 8 == 2
#define BIG_ENDIAN
#endif
huanyun 2006-08-29
  • 打赏
  • 举报
回复
我遇见就问题就是AIX上的编译器对 ‘1234’给出了警告 并得到错误的结果
superarhow 2006-08-29
  • 打赏
  • 举报
回复
。。。。。。纠正,不对,*没法在编译时运算。
superarhow 2006-08-29
  • 打赏
  • 举报
回复
偶觉得'1234'这种语法可能不同编译器会有不同的解释,说不定有的编译器根本就忽略后面的234呢。应当使用一种较通用的。
建议这样定义:
#if *(int *)"\x001\x002\x003\x004" == 0x04030201
#define X_PLATFORM_ENDIAN X_PLATFORM_LITTLE_ENDIAN
#elif *(int *)"\x001\x002\x003\x004" == 0x01020304
...// big endian
wangk 2006-08-29
  • 打赏
  • 举报
回复
你可以用X_PLATFORM_LITTLE_ENDIAN来替换,那么他就根据X_PLATFORM_LITTLE_ENDIAN定义的值了。
snowbirdfly 2006-08-28
  • 打赏
  • 举报
回复
(0x1234 & 0xF000 ) == 0x1000 )
这个的确是恒成立~~~
snowbirdfly 2006-08-28
  • 打赏
  • 举报
回复
if(*pInt >> 24 == 1)
{
X_PLATFORM_LITTLE_ENDIAN
}
else
{
X_PLATFORM_BIG_ENDIAN
}
那你这样定义的话,那#error没有处理阿~~~
那还要加一个分支~~~
huanyun 2006-08-28
  • 打赏
  • 举报
回复
回复 wangk(倒之)

#if ((0x1234 & 0xF000 ) == 0x1000 )
#define X_PLATFORM_ENDIAN X_PLATFORM_LITTLE_ENDIAN
#elif ((0x1234 & 0xF000 ) == 0x4000 )
#define X_PLATFORM_ENDIAN X_PLATFORM_BIG_ENDIAN
#else
#error 字节顺序不是1234和4321
#endif

那么
((0x1234 & 0xF000 ) == 0x1000 ) 是不是恒成立啊!
huanyun 2006-08-28
  • 打赏
  • 举报
回复
#define X_PLATFORM_LITTLE_ENDIAN 1234
#define X_PLATFORM_BIG_ENDIAN 4321

空格掉了而已
huanyun 2006-08-28
  • 打赏
  • 举报
回复
我认为是定义了一个字符串数组
类似于
BYTE pData[4] = {'4', '3', '2', '1'};
int* pInt = (int*)pData;
if(*pInt >> 24 == 1)
{
X_PLATFORM_LITTLE_ENDIAN
}
else
{
X_PLATFORM_BIG_ENDIAN
}
snowbirdfly 2006-08-28
  • 打赏
  • 举报
回复
#define X_PLATFORM_LITTLE_ENDIAN1234
楼主这样写的风格好差~~
让人以为X_PLATFORM_LITTLE_ENDIAN1234是一个标示~~~
还有就是'1234'这个好像没有见过~~
wangk 2006-08-28
  • 打赏
  • 举报
回复
建议这样使用:

#define X_PLATFORM_LITTLE_ENDIAN 0x1234
#define X_PLATFORM_BIG_ENDIAN 0x4321

#if ((0x1234 & 0xF000 ) == 0x1000 )
#define X_PLATFORM_ENDIAN X_PLATFORM_LITTLE_ENDIAN
#elif ((0x1234 & 0xF000 ) == 0x4000 )
#define X_PLATFORM_ENDIAN X_PLATFORM_BIG_ENDIAN
#else
#error 字节顺序不是1234和4321
#endif
豆腐 2006-08-28
  • 打赏
  • 举报
回复
'1234'是什么表达方式???字符串?还是数值?

晕死,没见过这样的宏
加载更多回复(1)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧