user-0 提问: 求解一个算法问题，怎么将一串数字转换为10进制

回复:
user: user-1
content: 引用 12 楼 lslvxy 的回复:现在又有个问题了，我要把这段程序烧到单片机中，但是keil c51不支持long long类型的数据。。 能不能把char y[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};直接转换成 char b=0x060504030201；呢？ 然后怎么进行逆运算呢，就是再把b转换成y[]?一个char的范围是-128~127,0x060504030201早都超过了。你的意思是转换成字符串吧？

user: user-2
content: 一句简单的不会就完了? 哪不会学哪,这叫什么问题.算法不会学算法,语法不懂学语法,你还能一辈子大拿?

user: user-3
content: 仅供参考#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(); }

user: user-4
content: 楼主，给你个真诚的建议，我觉得你问的问题很基础而且很杂很多，也许你都未必弄清楚究根结底自己需要问些什么，问题出在哪里？要说明白你问的问题可能要打较多的字，而且也未必能表达的让人接受，建议找一本最基础的书籍看看查查，我相信这样你入门比在这里看别人的帖子要快，而且收获也会更多。

user: user-3
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  相由心生！

user: user-0
content: 现在又有个问题了，我要把这段程序烧到单片机中，但是keil c51不支持long long类型的数据。。 能不能把char y[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};直接转换成 char b=0x060504030201；呢？ 然后怎么进行逆运算呢，就是再把b转换成y[]?

user: user-0
content: 引用 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[]形式的，请问怎么运算转回去呢？

user: user-4
content: 那我提供的第一段代码和上面各位的代码都可以做到。 存在里面的数据无所谓是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]

user: user-0
content: 引用 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进制之后的数据。

user: user-4
content: 你们不觉得你们的答案不对？楼主明显是希望{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可以随意组合得到你想要的最后结果

user: user-5
content: 数据都是以2进制的形式存储在内存中，输出只是一种形式，对于小端机器可以如下输出： 	unsigned char y[] = {0x01,0x02,0x03,0x04,0x05,0x06}; 	printf("%#0.12llx \n",*(long long*)y); 	printf("%lld \n",*(long long*)y);

user: user-6
content: 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; }

user: user-7
content: 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类型

user: user-0
content: 引用 3 楼 KenZhang1031 的回复:这个问题，你要说出你的数组Y[]到底是什么类型的才行啊，是char还是int又或者是别的什么。 是char类型的。

user: user-4
content: 这个问题，你要说出你的数组Y[]到底是什么类型的才行啊，是char还是int又或者是别的什么。

user: user-0
content: 引用 1 楼 hm530 的回复:其实只要搞清楚 十进制与十六进制是怎么换算的，你就会写了。 那什么八进制转十六进制什么什么的都不在话下了。怎么把题目中的数组转换成一个数呢？

user: user-8
content: 其实只要搞清楚 十进制与十六进制是怎么换算的，你就会写了。 那什么八进制转十六进制什么什么的都不在话下了。