16进制byte转换成10进制byte数组

DH_Ashur 2009-02-27 07:14:15
比如原来的十六进制数组为: byte hex[] = {0xFF, 0xFF, 0xFF, 0xFF};
那么16进制的0xFFFFFFFF其对应的10进制值为4294967295, 需要转换成10进制数组为:
byte dec[] = {0x04, 0x02, 0x09, 0x04, 0x09, 0x06, 0x07, 0x02, 0x09, 0x05};

不允许使用库函数,而且只能使用short和byte两种类型!
寻求高效的解法!
...全文
1943 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
开发者孙小聪 2011-02-25
  • 打赏
  • 举报
回复
我好想可以发表了 。 希望高手回复。。。。。。。。
softx1234 2009-02-28
  • 打赏
  • 举报
回复
老发不出去了,说我在恶意灌水,只好换个帐号来发:

真是粗心大意,可能是太晚要睡了:
const BYTE mulFactor[] = {0x06, 0x05, 0x05, 0x03, 0x06};
漏写了一个BYTE

const BYTE one[] = {0, 1};
const int endian = (1 == *(short*)one) ? 1 : 0;
short one, two;
居然one重复定义了:
const BYTE testone[] = {0, 1};
const int endian = (1 == *(short*)testone) ? 1 : 0;
short one, two;

再有错也懒得管了,反正就是这个意思了。
fbzok 2009-02-28
  • 打赏
  • 举报
回复
把刚才发的修正一下,还是得考虑字节序,而且不是刚才说的直接相乘,不好意思:)

BYTE hex[ 4]; // {0xFF, 0xFF, 0xFF, 0xFF};
BYTE dec[10] = {0}; // {0x04, 0x02, 0x09, 0x04, 0x09, 0x06, 0x07, 0x02, 0x09, 0x05};
const mulFactor[] = {0x06, 0x05, 0x05, 0x03, 0x06};
BYTE oneDec[5] = {0};
BYTE twoDec[5] = {0};
const BYTE one[] = {0, 1};
const int endian = (1 == *(short*)one) ? 1 : 0;
short one, two;
if(endian)
{
one = *(short*)hex;
two = *((short*)hex+1);
}
else
{
one = *((short*)hex+1);
two = *(short*)hex;
}
/*
1.通过对one,two逐位除10取余,分别填充oneDec,twoDec
假设one=65535,那么oneDec应该填充成{0x06, 0x05, 0x05, 0x03, 0x05}
假设two=10000,那么twoDec应该填充成{0x01, 0x00, 0x00, 0x00, 0x00}
2.用代码模拟小学计算乘法的方法:列竖式。先将one乘以65536 :
65535
× 65536
----------------
4294901760
将结果填充至dec数组内,涉及到进位时要在前面加。
3.用代码模拟小学计算加法的方法:列竖式。将dec的后面5位数值和twoDec逐位相加
4294901760
+ 10000
-----------------
4294911760
将结果填充至dec数组内,涉及到进位时要在前面加。
3.剩下基本就是把代码写出来调试了
*/

我觉得应该有更好的方法,只是现在还只想到了这个,希望高手路过时,指点一下。。。
fbzok 2009-02-28
  • 打赏
  • 举报
回复
19楼的代码里已经把字节序考虑进去了
DH_Ashur 2009-02-28
  • 打赏
  • 举报
回复
可以不用考虑字节序,就当做big-endian来处理好了!
DH_Ashur 2009-02-28
  • 打赏
  • 举报
回复
高人还没出现啊!
DH_Ashur 2009-02-28
  • 打赏
  • 举报
回复
顶一下!
fbzok 2009-02-27
  • 打赏
  • 举报
回复
这样有点问题,要改一下,不是直接相乘的
fbzok 2009-02-27
  • 打赏
  • 举报
回复

BYTE hex[ 4]; // {0xFF, 0xFF, 0xFF, 0xFF};
BYTE dec[10]; // {0x04, 0x02, 0x09, 0x04, 0x09, 0x06, 0x07, 0x02, 0x09, 0x05};
BYTE oneDec[5];
BYTE twoDec[5];
//模拟两个short相乘,这样取出short不用考虑字节序了
short one = *(short*)hex;
short two = *((short*)hex+1);
/*
1.通过对one,two逐位除10取余,分别填充oneDec,twoDec
假设one=65535,那么oneDec应该填充成{0x06, 0x05, 0x05, 0x03, 0x05}
假设two=10000,那么twoDec应该填充成{0x01, 0x00, 0x00, 0x00, 0x00}
2.用代码模拟小学计算乘法的方法:列竖式
65535
× 10000
----------------
将结果填充至dec数组内,涉及到进位时要在前面加。
3.剩下基本就是把代码写出来调试了
*/

这只是一种思路,希望抛砖引玉,得到高手更高效的方案。。。
rgmlkthh 2009-02-27
  • 打赏
  • 举报
回复
mark一下,等高手。
rgmlkthh 2009-02-27
  • 打赏
  • 举报
回复
mark一下,等高手。
fbzok 2009-02-27
  • 打赏
  • 举报
回复
这个题目其实并不像看起来那么简单。中间变量都不能使用其它类型,还要考虑字节序的问题
arong1234 2009-02-27
  • 打赏
  • 举报
回复
更正你一下,应该是byte数组,有byte数组,多大的数都搞得定

[Quote=引用 12 楼 DH_Ashur 的回复:]
引用 8 楼 sxbwelcome 的回复:
在计算机内部,十六进制到十进制的转换是不需要的,不管什么数据在计算机中存储的都是01,只是我们看待的方式不同
那现在的问题就是把十进制数的每一位数字提取出来
可以不断地除10取余,从低位逐次得到每一位数字,
再将其逆序

问题是除于10得到的商有可能很大,而题目要求整个函数只能使用byte、short两种数据类型!
这个中间变量的保存就是难题的关键了。
[/Quote]
arong1234 2009-02-27
  • 打赏
  • 举报
回复
不就是循环用%和/么?要什么库函数?你这个限制很奇特

[Quote=引用 4 楼 DH_Ashur 的回复:]
引用 2 楼 wsq279024988 的回复:
用什么语言实现啊?C#么

C#或C/C++都可以
但请注意只能用BYTE 和 short两种类型!!!
还有就是不允许使用库函数!
[/Quote]
DH_Ashur 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sxbwelcome 的回复:]
在计算机内部,十六进制到十进制的转换是不需要的,不管什么数据在计算机中存储的都是01,只是我们看待的方式不同
那现在的问题就是把十进制数的每一位数字提取出来
可以不断地除10取余,从低位逐次得到每一位数字,
再将其逆序
[/Quote]
问题是除于10得到的商有可能很大,而题目要求整个函数只能使用byte、short两种数据类型!
这个中间变量的保存就是难题的关键了。
DH_Ashur 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zclever 的回复:]
itoa,atoi,然后循环%10
[/Quote]

请仔细查看下题目要求!
DH_Ashur 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 juniosan01 的回复:]
而且只能使用short和byte两种类型!
中间变量可以不可以用其他类型
[/Quote]

不可以!整个函数中都只能出现byte、short两种类型!
sxbwelcome 2009-02-27
  • 打赏
  • 举报
回复
在计算机内部,十六进制到十进制的转换是不需要的,不管什么数据在计算机中存储的都是01,只是我们看待的方式不同
那现在的问题就是把十进制数的每一位数字提取出来
可以不断地除10取余,从低位逐次得到每一位数字,
再将其逆序
zclever 2009-02-27
  • 打赏
  • 举报
回复
itoa,atoi,然后循环%10
juniosan01 2009-02-27
  • 打赏
  • 举报
回复
而且只能使用short和byte两种类型!
中间变量可以不可以用其他类型
加载更多回复(5)

64,680

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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