◎◎◎急 急, 关于4个byte转换成一个dword! 解决马上给分!!!!
例如: 四个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




