MFC 4字节转成一个整数

cky77 2018-11-29 03:39:26
四个字节代表一个时间。
int n=0;
BYTE time[4];
time[0]=0x00;
time[1]=0x00;
time[2]=0x00;
time[3]=0x86;

我想取得这个时间。
memcpy(&n,time,4);
//得到n的值是-2046820352

n = time[0] << 24 + time[1] << 16 +time[2] << 8 + time[3];
//n的值是0.


问题:我该怎么得到这个时间?感觉得到的数不对
...全文
524 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
cky77 2019-01-02
  • 打赏
  • 举报
回复
感谢各位的回复,分数有点少,见谅
worldy 2018-12-12
  • 打赏
  • 举报
回复
使用移位运算必须非常注意优先级顺序,否则,结果可能不是你要的

n = (time[0] << 24) + (time[1] << 16) +(time[2] << 8) + time[3];
xiaohuh421 2018-12-07
  • 打赏
  • 举报
回复
(int)(time[0] << 24) + (int)(time[1] << 16) + (int)(time[2] << 8) + (int)(time[3]); 这种写法可能是有问题的. 因为BYTE类型左移24位, 溢出, 只能得到0, 其它同理. 正确写法:(大端) int val = time[0]; val <<= 8; val |= time[1]; val <<= 8; val |= time[2]; val <<=8; val |= time[3]; 小端写法类似.
xiaohuh421 2018-12-07
  • 打赏
  • 举报
回复
BYTE time[4]; time[0] = 0x12; time[1] = 0x34; time[2] = 0x56; time[3] = 0x78; int val = *(int*)time; printf("0x%X",val); 如果是小端, val的值为: 0x78563412 ; 因为小端 即 低字节在前. 如果是大端: val的值为: 0x12345678 ; 大端是高字节在前.
JamesWu9527 2018-12-06
  • 打赏
  • 举报
回复
有数:0x12345678
大端显示:12 34 56 78
小端显示:78 56 34 12
schlafenhamster 2018-12-04
  • 打赏
  • 举报
回复
因为 多字节 数据类型 (如 int 4字节 32位)在内存中有个 顺序问题 , 如果 低地址 的 那个 字节 放 内存 的 地址上 , 叫 小端 顺序。
反之 叫 大端 顺序。 不同的 CPU 有不同的 顺序 所以 才有 大小端 转换 。
cky77 2018-12-04
  • 打赏
  • 举报
回复



引用 13 楼 Eleven 的回复:
int n = 0;
BYTE time[4];
time[0] = 0x00;
time[1] = 0x00;
time[2] = 0x00;
time[3] = 0x86;
n = (int)(time[0] << 24) + (int)(time[1] << 16) + (int)(time[2] << 8) + (int)(time[3]);

emm,这个是我想要的,但是我还是不知道他们说的大小端和四个字节转一个数有啥关系。
Eleven 2018-11-30
  • 打赏
  • 举报
回复
n = MAKELONG(MAKEWORD(time[3], time[2]), MAKEWORD(time[1], time[0]));
Eleven 2018-11-30
  • 打赏
  • 举报
回复
int n = 0;
BYTE time[4];
time[0] = 0x00;
time[1] = 0x00;
time[2] = 0x00;
time[3] = 0x86;
n = (int)(time[0] << 24) + (int)(time[1] << 16) + (int)(time[2] << 8) + (int)(time[3]);
hurryboylqs 2018-11-30
  • 打赏
  • 举报
回复
小端是低位先存(应该说是低字节先存)数字 0x00 00 00 86 在内存中是86 00 00 00,计算机是按一个字节一个字节的存取数据的,那么如果buffer中的值是00 00 00 86 转换成数字就是86 00 00 00,要想得到数字00 00 00 86那在内存中这么存放就可以了:buff[4] = {0x86,0x00,0x00,0x00},而不是你写的:

BYTE time[4];
time[0]=0x00;
time[1]=0x00;
time[2]=0x00;
time[3]=0x86;
//改成下面这样:
time[0]=0x86;
time[1]=0x00;
time[2]=0x00;
time[3]=0x00;
验证低位先存还是高位先存(小端还是大端),可以用下面的代码验证:

//以下代码是引用https://blog.csdn.net/ninili123456/article/details/53196090
int is_little_endian(void)//判断是否是小端的函数
{
union check_fun
{
int a;
char b;
}u1;
u1.a=1;//先将1(实际上就是0x0001)这个低字节放在存储空间的低位上
return u1.b;//这里实际上是进行了类型的强制装换
}
int main()
{
int i=is_little_endian();
if(i==1)
printf("little\n");//首先因为cpu在对存储数据的读取是从低位向高位读取的,而且在union中所有的成员是对齐读取的,所以如果读取到的b=1,说明char b是存放在低字节的
else
printf("big endian\n");
}
--------------------- 
作者:尼尼熊孩子 
来源:CSDN 
原文:https://blog.csdn.net/ninili123456/article/details/53196090 
版权声明:本文为博主原创文章,转载请附上博文链接!
schlafenhamster 2018-11-30
  • 打赏
  • 举报
回复
改成unsigned int

int 从 0-0x7fffffff 是 + 数
从 0x80000000 到 0xffffffff 是 负数

大小端 与 机器 (cpu)有关 , 微软是 小端 (little endian)
cky77 2018-11-29
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
GetTickCount
The GetTickCount function retrieves the number of milliseconds that have elapsed since the system was started. It is limited to the resolution of the system timer. If you need a higher resolution timer, use amultimedia timer or a high-resolution timer.

DWORD GetTickCount(VOID)

00 00 00 86 小端就是 :
0x86000000=2248146944 ms 太大了 =26天 !


memcpy(&n,time,4);
//得到n的值是-2046820352
我要是把n 改成unsigned int的话
memcpy之后n就是2248146944

然后我还是不懂,0x00 00 00 86为什么一定要大小端转换,它就不能代表134ms吗?
还有四个字节代表一个时间,不是能转成20181129231956这种形式的吗
hurryboylqs 2018-11-29
  • 打赏
  • 举报
回复
这个是因为小端,也就是数字0x00000086在小端机的内存中是这么存放的 86000000,那么反过来如果你给出内存中的数值是0x00000086,实际表示成数字的话就是0x86000000,这个值表示成整数越界了吧?
schlafenhamster 2018-11-29
  • 打赏
  • 举报
回复
GetTickCount
The GetTickCount function retrieves the number of milliseconds that have elapsed since the system was started. It is limited to the resolution of the system timer. If you need a higher resolution timer, use amultimedia timer or a high-resolution timer.

DWORD GetTickCount(VOID)

00 00 00 86 小端就是 :
0x86000000=2248146944 ms 太大了 =26天 !
cky77 2018-11-29
  • 打赏
  • 举报
回复
我就是想问数组里是00 00 00 86,这四个字节代表一个啥数,啥时间,咋算
cky77 2018-11-29
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
union TmOrBytes
{
time_t tm;
BYTE time[4];
};

TmOrBytes tm;
tm.tm=GetTickCount();
afxDump << tm.time[0]<< "\n";// 91
afxDump << tm.time[1]<< "\n";// 154
afxDump << tm.time[2]<< "\n";// 36
afxDump << tm.time[3]<< "\n";// 0
afxDump.HexDump( "0x", tm.time, 4, 4 );// 0x 5B 9A 24 00


终于等到你,但是看不懂
schlafenhamster 2018-11-29
  • 打赏
  • 举报
回复
// tm,tm=0x00249A5B 小端 !
schlafenhamster 2018-11-29
  • 打赏
  • 举报
回复
union TmOrBytes
{
time_t tm;
BYTE time[4];
};

TmOrBytes tm;
tm.tm=GetTickCount();
afxDump << tm.time[0]<< "\n";// 91
afxDump << tm.time[1]<< "\n";// 154
afxDump << tm.time[2]<< "\n";// 36
afxDump << tm.time[3]<< "\n";// 0
afxDump.HexDump( "0x", tm.time, 4, 4 );// 0x 5B 9A 24 00
cky77 2018-11-29
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
先了解下大端模式和小端模式

大哥,请直接棒喝我,查了半天书了。
zgl7903 2018-11-29
  • 打赏
  • 举报
回复
先了解下大端模式和小端模式



16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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