求助 :16进制日期转化的问题

fzx4936 2008-12-26 10:35:45
请教:
63 8A 8A 7D-->10进制--->/86400 +"1970-01-01" 是如何得到2008-12-26 hh:mm:ss的?
我怎么算都是2036-9-29 hh:mm:ss,并且在FlesHEX里看也是2036 sep 29 hh=mm:ss.
晕!头大!
...全文
285 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2008-12-29
  • 打赏
  • 举报
回复
&H100000 = 2^20,不仅在运算中要尽量简化,而且 2^20 的值是 Double 类型,更多出来类型转化的工作。

unsigned uDate = ( ( uTime < <16)>>27); 

按照 C 的规则,其实是将最高 16 位清除,最终右移 27-16=11 位,所以有效位为 32-16-11=5。
2^11 = &H800,5 个最低位的掩码就是 &H1F&,用 And 操作就可以其它的位过滤掉。
fzx4936 2008-12-29
  • 打赏
  • 举报
回复
Tiger_Zhao老师:
麻烦您给我讲讲运算过程
比如:iYear = DWord \ &H100000 是右移例几位?
iDay = (DWord \ &H800) And &H1F&又是什么意思?
fzx4936 2008-12-29
  • 打赏
  • 举报
回复
Tiger_Zhao老师:
太谢谢您了!
我和那段vc代码处理的是同一个问题
我想他可能是写错
您的代码解决了我的大问题
Tiger_Zhao 2008-12-29
  • 打赏
  • 举报
回复
Function DWord2Date(ByVal DWord As Long) As Date
Dim iYear As Integer, iMonth As Integer, iDay As Integer
Dim iHour As Integer, iMinute As Integer

iYear = DWord \ &H100000
iMonth = (DWord \ &H10000) And &HF&
iDay = (DWord \ &H800) And &H1F&
iHour = (DWord \ &H40) And &H1F&
iMinute = DWord And &H3F&

DWord2Date = DateSerial(iYear, iMonth, iDay) _
+ TimeSerial(iHour, iMinute, 0)
End Function

结果是 2008-10-17 09:35,C 代码与你举的例子不符。
fzx4936 2008-12-29
  • 打赏
  • 举报
回复
各位老师 出手帮帮我吧
我用以下代码已经算出了"年"
但在计算"月"时"溢出"了 不知道该怎么办了

Const s As Long = 2106231395

y = s \ 2 ^ 20'正确
m = (s * 2 ^ 12) \ 2 ^ 28'溢出
d = s * 2 ^ 16 \ 2 ^ 27
h = (s * 2 ^ 21) \ 2 ^ 27
m = (s1 * 2 ^ 26) \ 2 ^ 26
fzx4936 2008-12-29
  • 打赏
  • 举报
回复
谢谢!!!!
cangwu 2008-12-28
  • 打赏
  • 举报
回复
如果真像LZ的说法,那肯定转换不回来的了。
SYSSZ 2008-12-28
  • 打赏
  • 举报
回复
建议将2008-12-26 hh:mm:ss反向运算看一看
fzx4936 2008-12-28
  • 打赏
  • 举报
回复
刚刚找到1个用vc写的
-----------------------
#include <conio.h>
#include <stdio.h>
int main()
{
FILE * fp = fopen( "d:\\dzh\\DATA\\SHase\\Min\\600000.nmn", "rb" );
if( ! fp ) return 0;
char pcBuf[ 40 ] = "" ;
for( unsigned i=0; i<48; i++ )
{
fread( pcBuf, sizeof( pcBuf ), 1, fp );
unsigned uTime = *( unsigned * ) pcBuf;
unsigned uYear = ( uTime>>20 );//右移20位
unsigned uMonth = ( ( uTime<<12)>>28);//先左移12位再右移28位
unsigned uDate = ( ( uTime<<16)>>27);
unsigned uHour = ( ( uTime<<21)>>27);
unsigned uMinute = ( ( uTime<<26)>>26);
double dOpen = double( *( float *)(pcBuf + 4) ) / 1000.0;
double dHigh = double( *(float * )(pcBuf + 8) )/ 1000.0;
double dLow = double(*(float*)(pcBuf+12))/1000.0;
double dClose = double(*(float*)(pcBuf+16) )/1000.0;
double dAmount = double(*(float*)(pcBuf+20));
double dVolume = double(*(float*)(pcBuf+24));

printf( "%u-%02u-%02u %02u:%02u %9.2f,%9.2f,%9.2f%9.2f%11.2f%11.2f\n",
uYear, uMonth, uDate, uHour, uMinute, dOpen, dHigh, dLow, dClose, dAmount, dVolume );
}
fclose( fp );
return 0;
}
----------------
但我不懂vc 所以请高手帮忙转成vb
fzx4936 2008-12-28
  • 打赏
  • 举报
回复
为了方便大家分析 我把部分数据贴上来
63 8A 8A 7D 80 34 00 00 BC 34 00 00 44 34 00 00 BC 34 00 00 EE 74 05 00 8E 67 00 00
00 00 00 00 00 00 00 00 00 00 00 00
68 8A 8A 7D B2 34 00 00 BC 34 00 00 58 34 00 00 58 34 00 00 5E F8 03 00 63 4B 00 00 00 00 00 00 00 00 00 00 00 00 00 00
6D 8A 8A 7D 3A 34 00 00 58 34 00 00 12 34 00 00 58 34 00 00 25 6F 01 00 41 1B 00 00 00 00 00 00 00 00 00 00 00 00 00 00
------------------------------------
除每条记录第1字段外,其他字段用binary都可以直接读出了. 第一字段读出后是一个长整形数(x), 转换后应的时间不等于其真正的时间,或许这个字段是需要某种运算的.
请大家帮我分析一下.谢谢
fzx4936 2008-12-27
  • 打赏
  • 举报
回复
再次请求各位老师出手帮助!!!!
zhou_zion 2008-12-27
  • 打赏
  • 举报
回复
帮顶一下
fzx4936 2008-12-27
  • 打赏
  • 举报
回复
再次请求帮助!!!!

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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