如何将一个长整型的高低字节调换?马上揭贴给分

ceble 2004-08-10 04:25:11
如何将一个长整型的高低字节调换?
例如
unsigned long int date=20021120(0X01317F80),
把date的高低字节调换后变成0X807F3101,即10进制的2155819265。
...全文
546 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
铖邑 2004-08-10
  • 打赏
  • 举报
回复
unsigned char *p = (unsigned char *)&date;
  • 打赏
  • 举报
回复
呜呜,又来晚了,分不到了
哎。郁闷。
ceble 2004-08-10
  • 打赏
  • 举报
回复
TO: zhangcg(白马)
你给出的两个函数极具收藏价值,可以解决包括本问题在内的许多问题,谢谢!

TO: yjy1001(蓝鲸--优秀得郁闷的鱼)
你给出的算法好象是按位翻转,不是按字节翻转,非常感谢你的关注

TO: jishiping(JSP 季世平)
无言的感激,永远的楷模


  • 打赏
  • 举报
回复
哈哈,大家都很强啊。我在给个汇编解法,也很简单,绝不浪费内存。-_-|||

//---------------------------------------------------------------------------
unsigned long int SwapByteOrder (unsigned long int Value)
{
asm
{
xor eax, eax
mov ebx, Value
mov ah, bl
mov al, bh
shl eax, 0x10
shr ebx, 0x10
mov ah, bl
mov al, bh
}
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
unsigned long int date = 20021120;//(0X01317F80),
Caption = SwapByteOrder(date);
}
过客猫2022 2004-08-10
  • 打赏
  • 举报
回复
哎,这么简单
老季的答案够简单了
yjy1001 2004-08-10
  • 打赏
  • 举报
回复
unsigned long int date=20021120(0X01317F80);

unsigned long int hig, low;

hig = (data & 0xffff0000) >> 16;
low = (data & 0x0000ffff);

data = hig | (low << 16 );

ShowMessage(IntToStr(data));

看结果就知道 正确的了

jishiping 2004-08-10
  • 打赏
  • 举报
回复
#include <algorith.h>

void SwapLong(DWORD& Val)
{
BYTE* pb = (BYTE*)&Val;
swap(pb[0], pb[3]);
swap(pb[1], pb[2]);
}
constantine 2004-08-10
  • 打赏
  • 举报
回复
用移位就可以了,不用多少代码,不过我现在要区吃饭,搞不定晚上找我,我帮你写
zhangcg 2004-08-10
  • 打赏
  • 举报
回复
用以下两个函数实现任意转换:
一个整数转换成标准的存储信息FF FF FF FF
另一个函数把 FF FF FF FF转化成具体的数值
AnsiString tranFloatToStr(const float fnum)
{
char buf[10];
AnsiString szInfo;
memcpy(buf,&fnum,4);
int i = buf[3];
szInfo = RightStr(IntToHex(i,2),2).SubString(1,1) + RightStr(IntToHex(i,2),2).SubString(2,1);
i = buf[2];
szInfo = szInfo + RightStr(IntToHex(i,2),2).SubString(1,1) + RightStr(IntToHex(i,2),2).SubString(2,1);
i = buf[1];
szInfo = szInfo + RightStr(IntToHex(i,2),2).SubString(1,1) + RightStr(IntToHex(i,2),2).SubString(2,1);
i = buf[0];
szInfo = szInfo + RightStr(IntToHex(i,2),2).SubString(1,1) + RightStr(IntToHex(i,2),2).SubString(2,1);
return szInfo;

}

float tranStrToFloat(const AnsiString szInfo)
{
float fnum;
char cbuf[5];
AnsiString sz1;

sz1 = szInfo.SubString(7,1) + szInfo.SubString(8,1) + szInfo.SubString(5,1) + szInfo.SubString(6,1) +
szInfo.SubString(3,1) + szInfo.SubString(4,1) + szInfo.SubString(1,1) + szInfo.SubString(2,1);
cbuf[0] = StrToInt("0x" + sz1.SubString(1,2));
cbuf[1] = StrToInt("0x" + sz1.SubString(3,2));
cbuf[2] = StrToInt("0x" + sz1.SubString(5,2));
cbuf[3] = StrToInt("0x" + sz1.SubString(7,2));
cbuf[4] = '\0';
memcpy(&fnum,cbuf,4);
return fnum;
}

ceble 2004-08-10
  • 打赏
  • 举报
回复
to:xpdavis(咕嘟)
不能通过编译,
unsigned char *p = &date;
指针类型错误
wcccc1 2004-08-10
  • 打赏
  • 举报
回复
用位操作的移位应也行吧.
wcccc1 2004-08-10
  • 打赏
  • 举报
回复
好办法
铖邑 2004-08-10
  • 打赏
  • 举报
回复
unsigned long int date=20021120(0X01317F80);
unsigned char *p = &date;
unsigned char c = *p;
*p = p[1];
p[1] = c;
c = p[2];
p[2] = p[3];
p[3] = c;
铖邑 2004-08-10
  • 打赏
  • 举报
回复
不好意思,上面是双字节的调换,单字节调换类似
unsigned long int date=20021120(0X01317F80);
unsigned char *p = &date;
unsigned char c = *p;
*p = p[1];
p[1] = c;
c = p[2];
p[2] = p[3];
p[4] = c;
铖邑 2004-08-10
  • 打赏
  • 举报
回复
unsigned long int date=20021120(0X01317F80);
unsigned short *p = &date;
unsigned short s = *p;
*p = p[1];
p[1] = s;

13,871

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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