关于二进制,十进制,十六进制之间的转换问题,基础在线等!

wwgddx 2006-09-11 01:56:03
问题一:
int a=30;
BYTE buf;
buf = a;
结果在buf的内存中的值会自动变成1E,而我想让它的值还保持为30,该怎么做?
如果是常数的话就可以在前面加0x,但是a是变量,所以不知道怎么解决,等.....

问题二:
BYTE *V1_Normaludp;
...
V1_Normaludp获得数据并且数据长度大于512
...
BYTE *V1_Tempudp= new BYTE(512);
我想把V1_Normaludp里的数据以512为单位分割并分别存储到V1_Tempudp里面,应该怎么做?
谢谢,在线等!
...全文
709 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
longbeibei 2006-09-11
  • 打赏
  • 举报
回复
char szX[]="0x17";
int i =0;

char szBin[13]=""; //存放二进制字符串
CString aaa,b;
sscanf(szX, "%x", &i); //将十六进制字符串转换成整型。
aaa.Format("%d",i);
MessageBox(aaa);
itoa(i, szBin, 2); //将整型转换成二进制字符串。
MessageBox(szBin);
itoa(i, szBin, 8); //将整型转换成8进制字符串。
MessageBox(szBin);
其他类似方法就可以转换
xiahouyi 2006-09-11
  • 打赏
  • 举报
回复
1.如上所说,把你要发的10进制化成16进制 
memcpy(V1_Tempudp, V1_Normaludp,sizeof(V1_Tempudp))
2.[],()是一样的.
wwgddx 2006-09-11
  • 打赏
  • 举报
回复
BYTE *V1_Normaludp;
...
V1_Normaludp获得数据并且数据长度大于512
...
BYTE *V1_Tempudp= new BYTE(512);
========================
BYTE *V1_Tempudp= new BYTE[512]; //new 出错了吧?
int i=0;
while(..) //如果V1_Normaludp还有数据没有处理,进行循环
{
memcpy(V1_Tempudp, V1_Normaludp+512*i, 512);
... //处理 V1_Tempudp 中的512字节数据
i++;
}

======================================
BYTE *V1_Tempudp= new BYTE(512);和BYTE *V1_Tempudp= new BYTE[512];
的区别是什么?
一条晚起的虫 2006-09-11
  • 打赏
  • 举报
回复
BCD码转换:30 --> 0x30: 30 / 10 * 16 + 30 % 10; //所有的数都可以这样算
一条晚起的虫 2006-09-11
  • 打赏
  • 举报
回复
BYTE数据的长度,好像没有函数可以获得。
V1_Normaludp前512的数据清空: V1_Normaludp += 512;
jixingzhong 2006-09-11
  • 打赏
  • 举报
回复
问题 1:

在计算机中, 数据是没有进制这个概念的,
比如这个 30,
你输出的时候 %d 就是 30, %x 就是 1E,
这个进制只是表现上的东西,
在内存中都是 2 进制的。
jixingzhong 2006-09-11
  • 打赏
  • 举报
回复
有没有什么方法可以memcpy一次之后就把V1_Normaludp前512的数据清空,这样每次都用
memcpy(V1_Tempudp, V1_Normaludp, 512);就可以了,
==========================
这个想法不合适,
你可以用 memmove 进行操作,
但是需要缓存保存原来的内容,然后移动, 繁琐,
不如上面给的 用一个 i 记录位置。


还有怎么知道V1_Normaludp 数据已经拷贝到结尾了呢?有没有什么方法可以得到BYTE数据的长度的函数呢?
========
得在 V1_Normaludp 末尾增加一个标记,
比如 char * 的字符串终结符
jixingzhong 2006-09-11
  • 打赏
  • 举报
回复
BYTE *V1_Normaludp;
...
V1_Normaludp获得数据并且数据长度大于512
...
BYTE *V1_Tempudp= new BYTE(512);
========================
BYTE *V1_Tempudp= new BYTE[512]; //new 出错了吧?
int i=0;
while(..) //如果V1_Normaludp还有数据没有处理,进行循环
{
memcpy(V1_Tempudp, V1_Normaludp+512*i, 512);
... //处理 V1_Tempudp 中的512字节数据
i++;
}
wwgddx 2006-09-11
  • 打赏
  • 举报
回复
2、memcpy(V1_Tempudp, V1_Normaludp, 512);
memcpy(V1_Tempudp, V1_Normaludp + 512, 512);
..................................................

有没有什么方法可以memcpy一次之后就把V1_Normaludp前512的数据清空,这样每次都用
memcpy(V1_Tempudp, V1_Normaludp, 512);就可以了,
还有怎么知道V1_Normaludp 数据已经拷贝到结尾了呢?有没有什么方法可以得到BYTE数据的长度的函数呢?
wwgddx 2006-09-11
  • 打赏
  • 举报
回复
BCD码压缩呀:把30转化成48不就得了?0x30 = 3*16 + 0*1;

//多几个判断就可以
------------------------------------
有没有简单点的方法?
KevinCEC 2006-09-11
  • 打赏
  • 举报
回复
BCD码压缩呀:把30转化成48不就得了?0x30 = 3*16 + 0*1;

//多几个判断就可以
一条晚起的虫 2006-09-11
  • 打赏
  • 举报
回复
1、计算机中本身以二进制保存数据,二进制,十进制,十六进制只是表现形式不同,实际上是一样的。
2、memcpy(V1_Tempudp, V1_Normaludp, 512);
memcpy(V1_Tempudp, V1_Normaludp + 512, 512);
...........

16,466

社区成员

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

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

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