CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

◎◎◎急 急, 关于4个byte转换成一个dword! 解决马上给分!!!!

楼主wltsui(-无招胜有招-)2002-11-15 10:13:48 在 VC/MFC / 基础类 提问

例如:   四个byte   126   24   21   0   转换成dword为2115507456,算法越简单越好!    
   
  谢谢!! 问题点数:119、回复次数:26Top

1 楼nustchenhf()回复于 2002-11-15 10:16:06 得分 10

#define   MAKEDW(ch0,   ch1,   ch2,   ch3)                                                       \  
  ((DWORD)(BYTE)(ch0)   |   ((DWORD)(BYTE)(ch1)   <<   8)   |       \  
  ((DWORD)(BYTE)(ch2)   <<   16)   |   ((DWORD)(BYTE)(ch3)   <<   24   ))Top

2 楼nustchenhf()回复于 2002-11-15 10:16:56 得分 0

够简单了把?Top

3 楼ruihuahan(飞不起来的笨鸟)回复于 2002-11-15 10:19:57 得分 0

难?Olympic   math   questin?Top

4 楼sunheart(深蓝)回复于 2002-11-15 10:20:25 得分 5

用移位啊,一个苯办法,把他们赋值给四个DWORD,然后移位再相加。算法可能不是最简。但思路应是移位  
  Top

5 楼happyfancy(斗斗星)回复于 2002-11-15 10:28:54 得分 5

gzing。。。  
               
              manlg@msn.comTop

6 楼cxiaobao(风子)回复于 2002-11-15 10:30:10 得分 5

nustchenhf()   的方法最简单。  
  下面的也算一种方法吧。  
  DWORD   dwDst;  
  char   ch0,ch1,ch2,ch3;  
  ...  
  char*   pch   =   (char*)&dwDst;  
  *pch   =   ch0;  
  *(pch+1)   =   ch1;  
  *(pch+2)   =   ch2;  
  *(pch+3)   =   ch3;  
   
  呵呵,由于“大头,小头”问题,这个办法只是用在intel机器上。Top

7 楼wltsui(-无招胜有招-)回复于 2002-11-15 10:34:43 得分 0

to   nustchenhf():  
    我试了,   有错,   呀,   他的反过程是这样的:  
   
  by1=(BYTE)m_IP   >>   24   );  
  by2=(BYTE)m_IP   >>   16   );  
  by3=(BYTE)m_IP   >>   8   );  
  by4=(BYTE)m_IP)   );  
  Top

8 楼nanjianhui(nan)回复于 2002-11-15 10:35:18 得分 30

用联合吧!!!  
  union   Change  
  {  
        DWORD   dwData;  
        byte     bData[8];  
  };  
   
  main()  
  {  
        Change   test;  
        memset(test.bData,   0,   8);  
        test.bData[0]=126;  
        test.bData[1]=24;  
        test.bData[2]=21;  
        test.bData[3]=0;  
        //这时,test.dwData就是你想要的数了,因为联合是共享内存的!!!  
  }Top

9 楼why_why(为什么呢)回复于 2002-11-15 10:37:19 得分 5

如果是一字节一字节的话就楼上nustchenhf()   的了,  
   
  如果是数组的话那用这个吧  
   
  DWORD   MAKEDW(PBYTE   BYTEA)  
  {  
    return   ((*(BYTEA+3)|((*(BYTEA+2))   <<   8)   |       \  
  ((*(BYTEA+1))<<   16)   |   ((*(BYTEA))   <<   24   ))  
  }Top

10 楼wltsui(-无招胜有招-)回复于 2002-11-15 10:39:15 得分 0

to   cxiaobao(风子)   :  
      我得是amd的机器,   用nustchenhf():的方法挥有问题吗,   我刚才测了,nustchenhf():的在我在有错!  
   
   
  Top

11 楼tangmian(勉)回复于 2002-11-15 11:12:52 得分 5

nanjianhui的方法是可以的!!!Top

12 楼nustchenhf()回复于 2002-11-15 11:18:38 得分 0

nanjianhui(nan)   的是个好方法!  
  to   wltsui(你跳,我也跳!)    
  by1=(BYTE)m_IP   >>   24   );  
  by2=(BYTE)m_IP   >>   16   );  
  by3=(BYTE)m_IP   >>   8   );  
  by4=(BYTE)m_IP)   );  
  这样的反向行为好象不对把?需要额外的处理。Top

13 楼wltsui(-无招胜有招-)回复于 2002-11-15 11:24:40 得分 0

to   nustchenhf():  
    我用ip控件的到的m_dwIP,然后转换就是这样做的:你说的额外处理是什么,请指教:  
   
  m_nAddr1   =   (BYTE)(   m_dwIP   >>   24   );  
  m_nAddr2   =   (BYTE)(   m_dwIP   >>   16   );  
  m_nAddr3   =   (BYTE)(   m_dwIP   >>   8   );  
  m_nAddr3   =   (BYTE)   m_dwIP;Top

14 楼wltsui(-无招胜有招-)回复于 2002-11-15 11:29:34 得分 0

to   nustchenhf():  
      兄弟,   你的改成这样,   我这里就对了,   是什么原因!  
   
   
  #define   MAKEDW(ch0,   ch1,   ch2,   ch3)                                                       \  
  ((DWORD)(BYTE)(ch3)   |   ((DWORD)(BYTE)(ch2)   <<   8)   |       \  
  ((DWORD)(BYTE)(ch1)   <<   16)   |   ((DWORD)(BYTE)(ch0)   <<   24   ))Top

15 楼wj59(wj59)回复于 2002-11-15 11:30:57 得分 5

联合!  
  高  
  UPTop

16 楼nanjianhui(nan)回复于 2002-11-15 11:32:02 得分 5

给大家一个建议!!!  
  尽量少使用define来实现一些简单函数的功能,   因为他可能导致不可预知的错误.你可以使用内联函数!!!Top

17 楼nustchenhf()回复于 2002-11-15 11:37:10 得分 2

呵呵,是的,Effective   C++   2E里面说尽量少用#define!用内联函数替代之Top

18 楼JennyVenus()回复于 2002-11-15 11:51:21 得分 2

dword   *d   =   (   dword   *   )byte;Top

19 楼athere_08(于斯)回复于 2002-11-15 12:54:38 得分 0

四个byte   126   24   21   0   转换成dword为2115507456  
  两组数据是什么关系啊。是由移位得到的吗?2115507456转化为16进制不是  
  7e181500啊!Top

20 楼athere_08(于斯)回复于 2002-11-15 13:07:13 得分 0

不好意思,我计算错了啊!Top

21 楼jfzsl(剿匪总司令)回复于 2002-11-15 13:22:33 得分 0

我一直在VC下用的两个函数!  
   
   
  //转换若干个HEX字节为长整形  
  //如:   {0x11,0x22}->   0x1122;  
   
  DWORD   Hex2Ulong(   BYTE   bLen,BYTE*   pbData   )  
  {  
  BYTE bTmp[4];  
  DWORD dwGetData;  
  BYTE* bData;  
   
  bData   =   pbData;  
   
  if(   bLen   >   4   )   return   0;  
   
  memset(   bTmp,0,4   );  
  for(   BYTE   i   =   0;i   <   bLen;i++   )  
  {  
  bTmp[i]   =   bData[bLen   -1   -   i];  
  }  
   
  memcpy(   (void*)&dwGetData,bTmp,4   );  
  return   dwGetData;  
   
  }  
  //   长整形   转换成   若干个HEX字节  
  //   如:   0x11223344   ->   {0x11,0x22,0x33,0x44}  
  BYTE*   Ulong2Hex(DWORD   dwSource0,BYTE   bLen,BYTE*   bData)  
  {  
  DWORD dwSource   =   dwSource0;  
  if(   bLen   >   4   )   return   NULL;  
  BYTE bTmp[4];  
   
  memcpy(bTmp,(void*)&dwSource,4);  
  for(   int   i   =   0;i   <   bLen;i++)  
  {  
  bData[i]   =   bTmp[bLen   -   1   -   i];  
  }  
  return   bData;  
  }Top

22 楼kiloculf(落河沉星)回复于 2002-11-15 14:14:01 得分 10

同意用内联函数,不赞成用defineTop

23 楼whorchid(*)兰花一现(*)回复于 2002-11-15 14:50:32 得分 15

仿照这个:  
   
  #define   RGB(r,g,b)     ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))Top

24 楼apple1978(灌蓝高手)回复于 2002-11-15 15:06:55 得分 5

很赞同   nanjianhui(nan)   (   )     的建议!!!!  
  {给大家一个建议!!!  
  尽量少使用define来实现一些简单函数的功能,   因为他可能导致不可预知的错误.你可以使用内联函数!!!}Top

25 楼awanghero(念天地之悠悠,独怆然而悌下!)回复于 2002-11-15 15:13:06 得分 5

RGB你用过吧,给你贴一贴  
  #define   RGB(r,g,b)                     ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))  
  所以  
  你的就是#define   MAKEDW(ch0,   ch1,   ch2,ch3)                                                        
  ((DWORD)(BYTE)(ch0)   |   ((DWORD)(BYTE)(ch1)   <<   8)   |        
  ((DWORD)(BYTE)(ch2)   <<   16)   |   ((DWORD)(BYTE)(ch3)   <<   24   ))  
  Top

26 楼awanghero(念天地之悠悠,独怆然而悌下!)回复于 2002-11-15 15:15:43 得分 5

应该是  
  #define   MAKEDW(ch0,   ch1,   ch2,ch3)                                                        
  ((DWORD)(BYTE)(ch3)   |   ((DWORD)(BYTE)(ch2)   <<   8)   |        
  ((DWORD)(BYTE)(ch1)   <<   16)   |   ((DWORD)(BYTE)(ch0)   <<   24   ))Top

相关问题

  • warning C4244: “=” : 从“DWORD”转换到“BYTE”,可能丢失数据
  • 问几个粗浅的问题:关于BYTE,DWORD类型转换
  • Delphi中使Int转换成Byte,Str转换成Byte的函数!急需!
  • 怎样把string转换成byte,byte转换成string急,在先等候,谢谢!
  • byte转换
  • ip转换到dword
  • pointer 与 byte 转换
  • string转换成byte???
  • char转换成byte
  • 如何将String转换为byte[]型,急用,立即送分

关键词

  • 转换
  • ip
  • bdata
  • dwip
  • naddr
  • bytea
  • makedw
  • nustchenhf
  • blen
  • dwsource

得分解答快速导航

  • 帖主:wltsui
  • nustchenhf
  • sunheart
  • happyfancy
  • cxiaobao
  • nanjianhui
  • why_why
  • tangmian
  • wj59
  • nanjianhui
  • nustchenhf
  • JennyVenus
  • kiloculf
  • whorchid
  • apple1978
  • awanghero
  • awanghero

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo