社区
C++ 语言
帖子详情
求助:如何将二进制字符串数组转换成无符号Int
bailee
2011-05-06 02:53:49
明确一点:不是什么char test[]="12345"用atoi转换成int i=12345;
而是:字符串为二进制,长度为4,想转换为DWORD,现在无解中...
看到用BitConverter转换,但没看明白。
...全文
526
17
打赏
收藏
求助:如何将二进制字符串数组转换成无符号Int
明确一点:不是什么char test[]="12345"用atoi转换成int i=12345; 而是:字符串为二进制,长度为4,想转换为DWORD,现在无解中... 看到用BitConverter转换,但没看明白。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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*)
而已。
C#微软培训资料
10.2 类 的 成 员 .113 10.3 构造函数和析构函数 .119 10.4 小 结 .122 第十一章 方 法 .124 11.1 方法的声明.124 11.2 方法中的参数.125 11.3 静态和非静态的方法.129 11.4 方法的重载.130 11.5 ...
C++算法题_02
编写一个程序,输入一个
二进制
的
字符串
(长度不超过32),然后计算出相应的十进制整数,并把它打印出来。 输入格式:输入为一个
字符串
,每个字符都是’0’或’1’,
字符串
的长度不超过32。 输出格式:输出一个...
C++
字符串
的处理-----全部用库函数,效率高
string定义:a) string s;...b) string s(str) //拷贝构造函数 生成str的复制品c) string s(str,stridx) //将
字符串
str内"始于位置stridx"的部分当作
字符串
的初值d) string s(str,stridx,s...
PYTHON 牛客刷题记录
1、HJ81
字符串
字符匹配--SET使用2、二维数组操作--map(),split()使用 一、pandas是什么? 1、HJ81
字符串
字符匹配–SET使用 描述 判断短
字符串
S中的所有字符是否在长
字符串
T中全部出现。 请注意本题有多组样例...
Shell编程实战范例
前言: 本部分主要参考此博客: ... 数值运算: 进制转换: ...由于bc是交互式的计算器, 所以这里没法直接使用参数的形式进行, 而是采用echo一个用分号分割的多条语句组成的
字符串
给bc, 其将自动打印结果 ec
C++ 语言
64,648
社区成员
250,503
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章