求解一个算法问题,怎么将一串数字转换为10进制

依山慕雪 2014-01-14 05:34:59
我有一个数组,存放的是6个16进制的数据:
  Y[0]=0x01;  
Y[1]=0x02;
Y[2]=0x03;
Y[3]=0x04;
Y[4]=0x05;
Y[5]=0x06;

首先要将数组转换为一个16进制的数据,结果是:
0x060504030201

然后再将得到的16进制数据转换为10进制的数据。
新手不会,求大神帮忙,最好是能写个完成的main方法。感谢了
...全文
494 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
starytx 2014-01-17
  • 打赏
  • 举报
回复
引用 12 楼 lslvxy 的回复:
现在又有个问题了,我要把这段程序烧到单片机中,但是keil c51不支持long long类型的数据。。 能不能把char y[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};直接转换成 char b=0x060504030201;呢? 然后怎么进行逆运算呢,就是再把b转换成y[]?
一个char的范围是-128~127,0x060504030201早都超过了。你的意思是转换成字符串吧?
dcw0402 2014-01-17
  • 打赏
  • 举报
回复
一句简单的不会就完了? 哪不会学哪,这叫什么问题.算法不会学算法,语法不懂学语法,你还能一辈子大拿?
赵4老师 2014-01-17
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
unsigned int iv,i;
unsigned char BCD[5];//定长10位BCD码
unsigned char sv[11];
void main() {
    iv=123456789;//最大10位无符号正整数
    //INT2BCD
    sprintf(sv,"%010u",iv);
    for (i=0;i<10;i+=2) {
        BCD[i/2]=(sv[i]<<4)|(sv[i+1]&0x0F);
    }
    printf("BCD=%02x%02x%02x%02x%02x\n",BCD[0],BCD[1],BCD[2],BCD[3],BCD[4]);
    //BCD2INT
    for (i=0;i<10;i+=2) {
        sv[i]='0'|(BCD[i/2]>>4);
        sv[i+1]='0'|(BCD[i/2]&0x0F);
    }
    sscanf(sv,"%010u",&iv);
    printf("iv=%010u\n",iv);
    getch();
}
Mr. Code 2014-01-17
  • 打赏
  • 举报
回复
楼主,给你个真诚的建议,我觉得你问的问题很基础而且很杂很多,也许你都未必弄清楚究根结底自己需要问些什么,问题出在哪里?要说明白你问的问题可能要打较多的字,而且也未必能表达的让人接受,建议找一本最基础的书籍看看查查,我相信这样你入门比在这里看别人的帖子要快,而且收获也会更多。
赵4老师 2014-01-15
  • 打赏
  • 举报
回复
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 相由心生!
依山慕雪 2014-01-15
  • 打赏
  • 举报
回复
现在又有个问题了,我要把这段程序烧到单片机中,但是keil c51不支持long long类型的数据。。 能不能把char y[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};直接转换成 char b=0x060504030201;呢? 然后怎么进行逆运算呢,就是再把b转换成y[]?
依山慕雪 2014-01-15
  • 打赏
  • 举报
回复
引用 10 楼 KenZhang1031 的回复:
那我提供的第一段代码和上面各位的代码都可以做到。 存在里面的数据无所谓是16进制还是10进制,数值都是那一个。比如存在电脑里面的二进制1100100,它既是十进制100,也是十六进制0x64。 [quote=引用 9 楼 lslvxy 的回复:] [quote=引用 8 楼 KenZhang1031 的回复:] 你们不觉得你们的答案不对?楼主明显是希望{0x01,0x02,0x03,0x04,0x05,0x06},最后得到十进制的60504030201。 {0x01,0x02,0x03,0x04,0x05,0x06}转为0x060504030201,如下做:
char y[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
long long b = *(long long *)y & ~((long long)(~0) << (sizeof(y) * 8)); // b=0x060504030201
{0x01,0x02,0x03,0x04,0x05,0x06}转为十进制的60504030201,可以不用生成16进制数,如下做:
char y[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
long long c = 0;
for(int i=sizeof(y) - 1; i>=0; i--)
{
    c = c * 100 + ((y[i] >> 4) & 0x0f) * 10 + (y[i] & 0x0f);
} // c=60504030201
16进制转10进制,比如0x060504030201转60504030201,如下做:
long long b = 0x060504030201;
long long c = 0;
long long count = 1;
while(b)
{
	c = c + (b & 0x0f) * count;
	b >>= 4;
	count *= 10;
} // c=60504030201 
LZ可以随意组合得到你想要的最后结果
不是直接把0x060504030201转60504030201,而是把0x060504030201转成10进制的数据,最后得到应该是0x060504030201转成10进制之后的数据。[/quote][/quote] 能跟我解释一下这段代码的意思吗?

char y[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
long long b = *(long long *)y & ~((long long)(~0) << (sizeof(y) * 8)); // b=0x060504030201
然后还有一个问题,怎么再把b给转回y[]呢?得到这个b之后要经过一系列运算后得到一个值,然后还有再转回char y[]形式的,请问怎么运算转回去呢?
Mr. Code 2014-01-14
  • 打赏
  • 举报
回复
那我提供的第一段代码和上面各位的代码都可以做到。 存在里面的数据无所谓是16进制还是10进制,数值都是那一个。比如存在电脑里面的二进制1100100,它既是十进制100,也是十六进制0x64。
引用 9 楼 lslvxy 的回复:
[quote=引用 8 楼 KenZhang1031 的回复:] 你们不觉得你们的答案不对?楼主明显是希望{0x01,0x02,0x03,0x04,0x05,0x06},最后得到十进制的60504030201。 {0x01,0x02,0x03,0x04,0x05,0x06}转为0x060504030201,如下做:
char y[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
long long b = *(long long *)y & ~((long long)(~0) << (sizeof(y) * 8)); // b=0x060504030201
{0x01,0x02,0x03,0x04,0x05,0x06}转为十进制的60504030201,可以不用生成16进制数,如下做:
char y[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
long long c = 0;
for(int i=sizeof(y) - 1; i>=0; i--)
{
    c = c * 100 + ((y[i] >> 4) & 0x0f) * 10 + (y[i] & 0x0f);
} // c=60504030201
16进制转10进制,比如0x060504030201转60504030201,如下做:
long long b = 0x060504030201;
long long c = 0;
long long count = 1;
while(b)
{
	c = c + (b & 0x0f) * count;
	b >>= 4;
	count *= 10;
} // c=60504030201 
LZ可以随意组合得到你想要的最后结果
不是直接把0x060504030201转60504030201,而是把0x060504030201转成10进制的数据,最后得到应该是0x060504030201转成10进制之后的数据。[/quote]
依山慕雪 2014-01-14
  • 打赏
  • 举报
回复
引用 8 楼 KenZhang1031 的回复:
你们不觉得你们的答案不对?楼主明显是希望{0x01,0x02,0x03,0x04,0x05,0x06},最后得到十进制的60504030201。 {0x01,0x02,0x03,0x04,0x05,0x06}转为0x060504030201,如下做:
char y[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
long long b = *(long long *)y & ~((long long)(~0) << (sizeof(y) * 8)); // b=0x060504030201
{0x01,0x02,0x03,0x04,0x05,0x06}转为十进制的60504030201,可以不用生成16进制数,如下做:
char y[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
long long c = 0;
for(int i=sizeof(y) - 1; i>=0; i--)
{
    c = c * 100 + ((y[i] >> 4) & 0x0f) * 10 + (y[i] & 0x0f);
} // c=60504030201
16进制转10进制,比如0x060504030201转60504030201,如下做:
long long b = 0x060504030201;
long long c = 0;
long long count = 1;
while(b)
{
	c = c + (b & 0x0f) * count;
	b >>= 4;
	count *= 10;
} // c=60504030201 
LZ可以随意组合得到你想要的最后结果
不是直接把0x060504030201转60504030201,而是把0x060504030201转成10进制的数据,最后得到应该是0x060504030201转成10进制之后的数据。
Mr. Code 2014-01-14
  • 打赏
  • 举报
回复
你们不觉得你们的答案不对?楼主明显是希望{0x01,0x02,0x03,0x04,0x05,0x06},最后得到十进制的60504030201。 {0x01,0x02,0x03,0x04,0x05,0x06}转为0x060504030201,如下做:
char y[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
long long b = *(long long *)y & ~((long long)(~0) << (sizeof(y) * 8)); // b=0x060504030201
{0x01,0x02,0x03,0x04,0x05,0x06}转为十进制的60504030201,可以不用生成16进制数,如下做:
char y[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
long long c = 0;
for(int i=sizeof(y) - 1; i>=0; i--)
{
    c = c * 100 + ((y[i] >> 4) & 0x0f) * 10 + (y[i] & 0x0f);
} // c=60504030201
16进制转10进制,比如0x060504030201转60504030201,如下做:
long long b = 0x060504030201;
long long c = 0;
long long count = 1;
while(b)
{
	c = c + (b & 0x0f) * count;
	b >>= 4;
	count *= 10;
} // c=60504030201 
LZ可以随意组合得到你想要的最后结果
AndyStevens 2014-01-14
  • 打赏
  • 举报
回复
数据都是以2进制的形式存储在内存中,输出只是一种形式,对于小端机器可以如下输出:
	unsigned char y[] = {0x01,0x02,0x03,0x04,0x05,0x06};
	printf("%#0.12llx \n",*(long long*)y);
	printf("%lld \n",*(long long*)y);
vipcxj 2014-01-14
  • 打赏
  • 举报
回复

int main()
{
  char Y[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
  long long result = 0LL;
  for (int i = 0; i < 6; ++i)
  {
      long long part = Y[i];
      result |= part << 8*i;
  }
  std::cout << std::hex << result << std::endl;
  return 0;
}
zhuobattle 2014-01-14
  • 打赏
  • 举报
回复

int main()
{
	char Y[6];
	Y[0]=0x01;  
	Y[1]=0x02;    
	Y[2]=0x03;  
	Y[3]=0x04;  
	Y[4]=0x05;  
	Y[5]=0x06;
	int i = 5;
	LONGLONG llMerge = 0;
	while(i >= 0)
	{
		llMerge = llMerge << 0x8 | Y[i];
		i--;
	}
	return 0;
}
//转成一个LONGLONG类型
依山慕雪 2014-01-14
  • 打赏
  • 举报
回复
引用 3 楼 KenZhang1031 的回复:
这个问题,你要说出你的数组Y[]到底是什么类型的才行啊,是char还是int又或者是别的什么。
是char类型的。
Mr. Code 2014-01-14
  • 打赏
  • 举报
回复
这个问题,你要说出你的数组Y[]到底是什么类型的才行啊,是char还是int又或者是别的什么。
依山慕雪 2014-01-14
  • 打赏
  • 举报
回复
引用 1 楼 hm530 的回复:
其实只要搞清楚 十进制与十六进制是怎么换算的,你就会写了。 那什么八进制转十六进制什么什么的都不在话下了。
怎么把题目中的数组转换成一个数呢?
  • 打赏
  • 举报
回复
其实只要搞清楚 十进制与十六进制是怎么换算的,你就会写了。 那什么八进制转十六进制什么什么的都不在话下了。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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