求助:如何将二进制字符串数组转换成无符号Int

bailee 2011-05-06 02:53:49
明确一点:不是什么char test[]="12345"用atoi转换成int i=12345;

而是:字符串为二进制,长度为4,想转换为DWORD,现在无解中...

看到用BitConverter转换,但没看明白。

...全文
526 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
bailee 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 niaojuuu 的回复:]

dwTime = dwHigh*(2^32) + dwLow

溢出了
[/Quote]

呵呵,谢谢你的关注

是溢出了,上面的获取时间部分只是根据得到的数据推理的,没说明白,不好意思。

现在改为先把2^32除以1000再用,dwLow也除以1000,就几毫秒的差别,关系也就不大了
niaojuuu 2011-05-06
  • 打赏
  • 举报
回复
dwTime = dwHigh*(2^32) + dwLow

溢出了
bailee 2011-05-06
  • 打赏
  • 举报
回复
谢谢大家,这贴分开少了,哎,平时都开100分的贴的。
请【版主】同意开新贴给【zhao4zhong1】加100分,这样的用户就是csdn的支柱。

其实算出来的值应该是没问题的,时间转换也没问题的。就是被搞糊涂了,看看我昨天的代码吧:
(注:pMsgData的内容就是:{0x00,0x00,0x01,0x2F,0xC0,0xD3,0xD2,0xCA}
DWORD i0 = (unsigned int)(unsigned char)*(pMsgData+0);
DWORD i1 = (unsigned int)(unsigned char)*(pMsgData+1);
DWORD i2 = (unsigned int)(unsigned char)*(pMsgData+2);
DWORD i3 = (unsigned int)(unsigned char)*(pMsgData+3);
DWORD i4 = (unsigned int)(unsigned char)*(pMsgData+4);
DWORD i5 = (unsigned int)(unsigned char)*(pMsgData+5);
DWORD i6 = (unsigned int)(unsigned char)*(pMsgData+6);
DWORD i7 = (unsigned int)(unsigned char)*(pMsgData+7);

DWORD dwHigh = (i0<<24| i1<<16 | i2<<8 | i3);【值为303】
DWORD dwLow = (i4<<24 | i5<<16 | i6<<8 | i7);【值为3235107530】

按服务器的数据格式,最终时间应为:dwTime = dwHigh*(2^32) + dwLow【值为:1304610198218】
所以问题出来了:
CTime cTimeServer(dwTime);【dwTime太大了,应该是一个10位的数字】
int iYear = cTimeServer.GetYear();【所以就错了罗】

如果把1304610198218后面3位直接去掉,就OK了,不明白呀,不明白
赵4老师 2011-05-06
  • 打赏
  • 举报
回复

CTime::CTime
CTime( );

CTime( const CTime& timeSrc );

CTime( time_t time );

CTime( int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec, int nDST = -1 );

CTime( WORD wDosDate, WORD wDosTime, int nDST = -1 );

CTime( const SYSTEMTIME& sysTime, int nDST = -1 );

CTime( const FILETIME& fileTime, int nDST = -1 );

赵4老师 2011-05-06
  • 打赏
  • 举报
回复
UTC时间转换可以用COleDateTime
COleDateTime::COleDateTime
COleDateTime( );
COleDateTime( const COleDateTime& dateSrc );
COleDateTime( const VARIANT& varSrc );
COleDateTime( DATE dtSrc );
COleDateTime( time_t timeSrc );
COleDateTime( const SYSTEMTIME& systimeSrc );
COleDateTime( const FILETIME& filetimeSrc );
COleDateTime( int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec );
COleDateTime( WORD wDosDate, WORD wDosTime );

niaojuuu 2011-05-06
  • 打赏
  • 举报
回复
把(DWORD)szLow都要改为(DWORD)(unsigend char)szLow
bailee 2011-05-06
  • 打赏
  • 举报
回复
通过倒序,确实为303,谢谢,呵。

[Quote=引用 8 楼 niaojuuu 的回复:]

你这样转是不对的
char szTest[4] = {0x00, 0x00, 0x01, 0x2F};
DWORD dwHigh = *((DWORD*)szTest);
那么dwHgh = 0x2f010000 = 788594688

其实比较直接的做法就是
DWORD dwHigh = (((DWORD)szTest[0]) << 24) + (((DWORD)szTest[1……
[/Quote]
这正是我以前的用法,但碰到问题了:请看:
方法一(已倒序后再赋值的):
char szLow[4] = {0xCA, 0xD2, 0xD3, 0xC0};
DWORD dwLow1 = *((DWORD*)szLow);
这个值是一个UTC时间的一部分,高位部分就是那303;但值为【3235107530】,那可是2072年的时间,有问题;

方法二:
char szLow[4] = {0xC0, 0xD3, 0xD2, 0xCA};【此为正序】
DWORD dwLow2 = (((DWORD)szLow[0]) << 24) + (((DWORD)szLow[1]) << 16) +(((DWORD)szLow[2]) << 8) +((DWORD)szLow[3]);
值为:【3218264522】

---------------------------------------------------------
不管对错,两种方法的值应该都一样呀,可现在不一样了,不了解,或许是我太笨了,哈哈哈


niaojuuu 2011-05-06
  • 打赏
  • 举报
回复
你这样转是不对的
char szTest[4] = {0x00, 0x00, 0x01, 0x2F};
DWORD dwHigh = *((DWORD*)szTest);
那么dwHgh = 0x2f010000 = 788594688

其实比较直接的做法就是
DWORD dwHigh = (((DWORD)szTest[0]) << 24) + (((DWORD)szTest[1]) << 16) +(((DWORD)szTest[2]) << 8) +((DWORD)szTest[3]);
bailee 2011-05-06
  • 打赏
  • 举报
回复
郁闷啦:
char szTest[4] = {0x00, 0x00, 0x01, 0x2F};
DWORD dwHigh = *((DWORD*)szTest);
结果是:
dwHigh值为:788594688。【应该为:303】
应该是有问题的不知道是不是【有符号】与【无符号】的问题,

急、急、急
bailee 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luciferisnotsatan 的回复:]

char arr[4] = {1,2,3,4};这样的?
直接转int就是了
int n = *((int *)arr);

另外,注意大小字节序问题
[/Quote]

也是这个意思,谢谢
bailee 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhao4zhong1 的回复:]

//小端存储
char hexbytes[4]={0x10,0xEF,0xCD,0xAB};
DWORD dw;
dw=*((DWORD *)hexbytes);
//或者
dw=*((DWORD *)&hexbytes[0]);
[/Quote]

就是这个意思:字节数组转换成无符号整数,现在还没去测试,不知道能不能成,有其他方案的朋友继续加油。
不过还是谢谢CSDN,谢谢大家:半夜提问,上午就有这么多朋友帮忙,很是感动!!!
赵4老师 2011-05-06
  • 打赏
  • 举报
回复
//小端存储
char hexbytes[4]={0x10,0xEF,0xCD,0xAB};
DWORD dw;
dw=*((DWORD *)hexbytes);
//或者
dw=*((DWORD *)&hexbytes[0]);
luciferisnotsatan 2011-05-06
  • 打赏
  • 举报
回复
char arr[4] = {1,2,3,4};这样的?
直接转int就是了
int n = *((int *)arr);

另外,注意大小字节序问题
greex 2011-05-06
  • 打赏
  • 举报
回复
楼主是要这个思路吧
unsigned int iTmp = 0;
for (int i=0;i<4;++i)
{
iTmp<< 8;
iTmp += Buff[i];
}
dianyancao 2011-05-06
  • 打赏
  • 举报
回复
君主裝置,顯卡中央
ljt3969636 2011-05-06
  • 打赏
  • 举报
回复
仅仅迁移数据的话,unsigned int*指之,然后解引用赋值之不满足你的要求吗?还是我还是没太理解您的意图,是要把取出的二进制转成十进制无符号整型存int呢还是怎么的 ?
qq120848369 2011-05-06
  • 打赏
  • 举报
回复
有符号数扩宽都会使用符号位填充的,用char数组转DWORD然后移位,肯定会填充很多1的。

对于小端机器, 为何不最初就按二进制从低到高顺序将字节放在unsigned char数组里,然后直接

强转为(DWORD*)就可以了。 即便此时机器是大端的,也不过就是逆序unsigned char数组之后,强转为(DWORD*)

而已。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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