十六进制c 字符串转换十六进制怎么转换成对应的十六进制数

查看: 7843|回复: 16
注册时间最后登录阅读权限0积分300精华0帖子
提示: 作者被禁止或删除 内容自动屏蔽
注册时间最后登录阅读权限50积分814精华0帖子
高级会员, 积分 814, 距离下一级还需 186 积分
哈哈,你例子是一个伪命题,你那个定义AA方法是不存在的。
只有可能是下面两种情况:
第一种:char AA[6]={0x0a,0x0f,0x01,0x0e,0x06,0x0c};复制代码第二种:char AA[6]={'a','f','1','e','6','c'};复制代码第一种:
移位就行了
unsigned long CharArrayToNumber( unsigned char *p_pBuff, int p_iSize )
{
& & & & if( NULL != p_pBuff && p_iSize & 0 && p_iSize &= 8 )
& & & & {
& & & & & & & & unsigned long ulRet = 0;
& & & & & & & & p_iSize -= 1;
& & & & & & & & for(int i=0;i&=p_iS++i)
& & & & & & & & {
& & & & & & & & & & & & ulRet |= ((unsigned long)(p_pBuff[i]))&&((p_iSize-i)&&2);
& & & & & & & & }
& & & & & & & & return ulR
& & & & }
& & & & else
& & & & {
& & & & & & & & // arduino 有没有 throw 我不知道,异常肯定就挂了,怎么调试我也不知道
& & & & & & & & //throw &CharArrayToNumber: arg error&;
& & & & & & & & return 0;
& & & & }
}
复制代码你的例子就写成:
char AA[6]={0x0a,0x0f,0x01,0x0e,0x06,0x0c};
unsigned long ulVal = CharArrayToNumber(AA,6);
复制代码第二种:
就比较麻烦了,需要一个字符到数字的转换,估计你想要这个的可能性大
inline unsigned long CharToNumber( unsigned char p_ucVal )
{
& & & & switch(p_ucVal)
& & & & {
& & & & case '0':
& & & & & & & & return 0;
& & & & case '1':
& & & & & & & & return 1;
& & & & case '2':
& & & & & & & & return 2;
& & & & case '3':
& & & & & & & & return 3;
& & & & case '4':
& & & & & & & & return 4;
& & & & case '5':
& & & & & & & & return 5;
& & & & case '6':
& & & & & & & & return 6;
& & & & case '7':
& & & & & & & & return 7;
& & & & case '8':
& & & & & & & & return 8;
& & & & case '9':
& & & & & & & & return 9;
& & & & case 'A':
& & & & & & & & return 10;
& & & & case 'B':
& & & & & & & & return 11;
& & & & case 'C':
& & & & & & & & return 12;
& & & & case 'D':
& & & & & & & & return 13;
& & & & case 'E':
& & & & & & & & return 14;
& & & & case 'F':
& & & & & & & & return 15;
& & & & case 'a':
& & & & & & & & return 10;
& & & & case 'b':
& & & & & & & & return 11;
& & & & case 'c':
& & & & & & & & return 12;
& & & & case 'd':
& & & & & & & & return 13;
& & & & case 'e':
& & & & & & & & return 14;
& & & & case 'f':
& & & & & & & & return 15;
& & & & default:
& & & & & & & & // arduino 有没有 throw 我不知道,异常肯定就挂了,怎么调试我也不知道
& & & & & & & & //throw &CharToNumber: arg error&;
& & & & & & & & return 0;
& & & & }
}
复制代码这么写为了速度快,当然为了好看可以把 A 和 a 写一起,但写一起编译器恐怕不能优化成跳转,AVR的汇编我不了解,哪位了解可以看一下反汇编确定一下。
如果不确定,又追求效率,可以自己优化,给个思路:
inline unsigned long CharToNumber( unsigned char p_ucVal )
{& & & & // 如果要用,具体 0 的数目对不对最好自己数清楚一下。。。
& & & & static const unsigned char __TransferArray[] = {0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,11,12,13,14,15};
& & & & if( p_ucVal &= '0' && p_ucVal &= 'f' )
& & & & {& & & & // 意思就是这一步在自己的代码里就保证了肯定是指针跳转
& & & & & & & & return __TransferArray[p_ucVal-'0'];
& & & & }
& & & & else
& & & & {
& & & & & & & & //throw &CharToNumber: arg error&;
& & & & & & & & return 0;
& & & & }
}
unsigned long CharArrayToNumber( unsigned char *p_pBuff, int p_iSize )
{
& & & & if( NULL != p_pBuff && p_iSize & 0 && p_iSize &= 8 )
& & & & {
& & & & & & & & unsigned long ulRet = 0;
& & & & & & & & p_iSize -= 1;
& & & & & & & & for(int i=0;i&=p_iS++i)
& & & & & & & & {
& & & & & & & & & & & & ulRet |= CharToNumber(p_pBuff[i])&&((p_iSize-i)&&2);
& & & & & & & & }
& & & & & & & & return ulR
& & & & }
& & & & else
& & & & {
& & & & & & & & //throw &CharArrayToNumber: arg error&;
& & & & & & & & return 0;
& & & & }
}
复制代码你的例子就写成:
char AA[6]={'a','f','1','e','6','c'};
unsigned long ulVal = CharArrayToNumber(AA,6);
复制代码=========================================================
ulVal 既是 0xAF1E6C 也是
printf(&ulVal=0x%X\n&, ulVal);
printf(&ulVal=0x%ld\n&, ulVal);
// 输出:
ulVal=0xAF1E6C
ulVal=
复制代码不过你这个需求真的很奇怪,一个 char 的范围本身就是 0x00-0xFF 了
你那个AA为什么不是 char AA[4]={0x00,0xaf,0x1e,0x6c} ?
如果是大端系统就可以直接:
unsigned long ulVal = *((unsigned long *)AA);
复制代码小端系统0、3字节1、2字节交换后,就和上面一样直接强转。
大致就这么几种,根据你的情况用吧。总的来说 arduino 对性能的要求比较苛刻,
但效率主要取决于设计思路,具体代码的优化只能是毛毛雨。
arduino 是大端还是小端系统我还真没注意,测一下很简单:
void TestEndian()
{
& & & & static union {
& & & & & & & & char _c[4];
& & & & & & & & unsigned long _l;
& & & & } __endian_test = { 'l', '0' ,'0', 'b'&&};
& & & & if( 'b' == ((char)__endian_test._l) )
& & & & & & & & printf(&是大端系统\n&);
& & & & else
& & & & & & & & printf(&是小端系统\n&);
}
复制代码
注册时间最后登录阅读权限50积分739精华0帖子
高级会员, 积分 739, 距离下一级还需 261 积分
膜拜一楼大神
注册时间最后登录阅读权限30积分481精华1帖子
中级会员, 积分 481, 距离下一级还需 19 积分
补充一楼大神的,先上一段代码char s[]=&0xA&;
i = strtol(s, NULL, 16);
printf(&%d&, i);复制代码使用strtol可以直接转化成十进制,百科中查下这个函数。你可以直接把AA作为参数放进来,楼主的AA定义是错的,得用1楼的第二种方式定义。
另外你要把AA变成0x开头的可以这样char tmpdata[32];
sprintf(tmpdata,&0x%s&,AA);
//tmpdata中就是0xAF1E6C字符串了
// 继续用strtol转换行了
int i= strtol(tmpdata,NULL,16);复制代码sprintf& & scanf& &memset& &memcpy 这四个函数还是比较有用的,前两个是对字符串操作,后两个是直接对内存数据操作,可以百科看一下
注册时间最后登录阅读权限0积分300精华0帖子
提示: 作者被禁止或删除 内容自动屏蔽
注册时间最后登录阅读权限30积分481精华1帖子
中级会员, 积分 481, 距离下一级还需 19 积分
lilho_e 发表于
非常感谢 jytong ,转角 两位兄弟的回复。
我先消化一下,回头再来请教!
谢谢你们二位!
数组清零你可以用memset函数memset(aa,0,aa占用的内存大小);
//这句是把AA数组所用内存全部设置为0复制代码C语言中数组定义不能没有长度,必须指定长度。如果你想用个变长的字符串的话可以使用char* 这是指针,不建议新手使用,不及时释放会造成内存泄漏
注册时间最后登录阅读权限30积分481精华1帖子
中级会员, 积分 481, 距离下一级还需 19 积分
另外你要截取字符串中间的某几位数据的话可以使用strncpy函数char data[]= &af1e6c........&;//这里直接赋值时候是可以不写数组长度的,编译器会自动指定data长度的
//要从第12位开始截取4个字符,出租是从0开始的还记得吧
char dest[5];//要定义5个字符的长度才能保存4个字符 切记
strncpy(dest,data+12,4);复制代码现在dest中就是你想要的数据了。别忘记字符串是用'\0'标识结束的,所以要定义5个&&内存中保存的数据举例: a3c4\0&&这就是内存中保存的数据
注册时间最后登录阅读权限0积分300精华0帖子
提示: 作者被禁止或删除 内容自动屏蔽
注册时间最后登录阅读权限0积分300精华0帖子
提示: 作者被禁止或删除 内容自动屏蔽
注册时间最后登录阅读权限30积分481精华1帖子
中级会员, 积分 481, 距离下一级还需 19 积分
lilho_e 发表于
再次感谢楼上两位兄弟的回复。
现在找到一个简单的函数解决了:
unsigned long ulVal =strtol(data, NULL ...
看来data数组中不需要加上0x开头是吧?
Powered by您所在的位置: &
iOS十六进制和字符串的相互转换
iOS十六进制和字符串的相互转换
本文为51CTO的网友介绍了iOS十六进制和字符串的相互转换的内容,其中为大家直接复制出了实现的代码段,希望大家自己试试。
NSString&*dictString&=&[dict&JSONFragment];&
用这个就行了。。。
dictString==={&content&:&Sadgfdfg&,&phoneno&:&&,&email&:&&}===&&&+&(NSString&*)stringFromHexString:(NSString&*)hexString&{&&&char&*myBuffer&=&(char&*)malloc((int)[hexString&length]&/&2&+&1);&bzero(myBuffer,&[hexString&length]&/&2&+&1);&for&(int&i&=&0;&i&&&[hexString&length]&-&1;&i&+=&2)&{&unsigned&int&anI&NSString&*&hexCharStr&=&[hexString&substringWithRange:NSMakeRange(i,&2)];&NSScanner&*&scanner&=&[[[NSScanner&alloc]&initWithString:hexCharStr]&autorelease];&[scanner&scanHexInt:&anInt];&myBuffer[i&/&2]&=&(char)anI&}&NSString&*unicodeString&=&[NSString&stringWithCString:myBuffer&encoding:4];&NSLog(@&------字符串=======%@&,unicodeString);&return&unicodeS&&&}&&&&+&(NSString&*)hexStringFromString:(NSString&*)string{&NSData&*myD&=&[string&dataUsingEncoding:NSUTF8StringEncoding];&Byte&*bytes&=&(Byte&*)[myD&bytes];&&NSString&*hexStr=@&&;&for(int&i=0;i&[myD&length];i++)&&{&NSString&*newHexStr&=&[NSString&stringWithFormat:@&%x&,bytes[i]&0xff];&&if([newHexStr&length]==1)&&hexStr&=&[NSString&stringWithFormat:@&%@0%@&,hexStr,newHexStr];&&else&&hexStr&=&[NSString&stringWithFormat:@&%@%@&,hexStr,newHexStr];&}&return&hexS&}&
【编辑推荐】【责任编辑: TEL:(010)】
关于&&的更多文章
Android 4.4即将发布,这对大家来说都是很期待的,当然,无论是
既然强大的Android Studio来了,有什么理由不去用呢?
作为Android开发者,最头疼是什么?相信大家会异口同
七夕,是让人听起来就觉得美好的日子,牛郎织女鹊桥相
PC互联网巨头百度、腾讯和阿里,通过在移动互联网投资
本书将实时系统、实时统一建模语言、实时系统的统一开发过程和Rational Rose RealTime建模环境有机地结合起来,以案例为基础,系
Windows Phone专家
Android开发专家
51CTO旗下网站您所在的位置:
[C#]怎样实现将十进制数转换成十六进制数
发表日期:日   作者:whitewin   点击:次
教材《Visual C# 2010从入门到精通》(John Sharp著,周靖译)在P115提到的将十进制数转换成八进制的算法如下:
int amount = int.Parse(number.Text);&// 获取文本框控件中输入的十进制数
steps.Text = &&;&&&&&&&&&&&&&&&&&&&&& // 显示结果的文本框清空
string current = &&;&&&&&&&&&&&&&&&&& // 存放转换结果的字符串,初始值为空串
&&& int nextDigit = amount % 8;&&&&&&&& &// 取amount除8的余数
&&& amount /= 8;&&&&&&&&&&&&&&&&&&& &&// 为下一次作准备,amout缩小8倍
&&& int digitCode = '0' + nextD&&&&&&& // (1)获取余数对应数字的字符编码
&&& char digit = Convert.ToChar(digitCode); // (2)将字符编码转换成字符型
&&& current = digit +&&&&&& &&// (3)将余数的字符编码添加至结果字符串的前面
&&& steps.Text += current + &\n&;&&&&&&&&&& // 将这步转换结果输出
}while (amount != 0);
上课时,我们曾经讨论过,上述的(1)(2)(3)可以用下面这一句代替:
current = nextDigit +
由于整型变量nextDigit与字符串变量current相加,实际上相当于current= nextDigit.ToString()& + current
我们上机调试过,上述程序能够正确将一个int范围内的整数转换成八进制数,并将每步转换的结果逐次在结果文本框中显示。
由于每一步除八的余数必须在0-7之间,直接可以转换成对应的字符'0'-'7'。上述程序可以轻松做到这一点。
现在我们需要将十进制数转换成十六进制,那么,每一步除16的余数是在0-15之间,它需要用字符'0'-'9','A','B&,'C','D','E','F'等16个符号来表示。
有的同学已经想到了,用if语句或switch语句来处理,来实现上述编码的转换,对应的程序如下:
int amount = int.Parse(number.Text);
steps.Text = &&;
string current = &&;
&& int nextDigit = amount % 16;
&& amount /= 16;
&& string code = &&;&&&&&& // code用以存储每一位对应的编码
&& switch (nextDigit)
&&&&&& case 10:
&&&&&&&&&& code = &A&;break;
&&&&&& case 11:
&&&&&& &&&&code = &B&; break;
&&&&&& case 12:
&&&&&&&&&& code = &C&; break;
&&&&&& case 13:
&&&&&&&&&& code = &D&; break;
&&&&&& case 14:
&&&&&&&&&& code = &E&; break;
&&&&&& case 15:
&&&&&&&&&& code = &F&; break;
&&&&&& default:&&& &&&&// 不满足10-15,必然是在0-9之间
&&&&&&&&&& code = nextDigit.ToString();
&&&&&& &&&&break;
&& current = code +
&& steps.Text += current + &\n&;&
} while (amount != 0);
经过调试,上述程序可以做到将十进制整数转换成对应的十六进制数,并逐步输出。
但上述使用switch语句进行转换的方法稍显烦琐,会造成代码过于臃肿,且可读性不太高。这种代码转换常用&查表转换法&。
所谓&查表转换法&,就是先将码表顺序存放在一个线性表或数组中,然后通过下标或索引快速找到某个数据所对应的编码。这种方法可以大大提高编码转换或者计算的效率,在算法实现中经常用到。
比如,我们可以将16进制用到的16个编码,先存放到一个名为codes的字符串变量中:
&&&string codes = &ABCDEF&;
之后,我们就可以通过求这个字符串字串(Substring)的方法,取某个数对应的编码。如:11对应的编码,就是上述字符串第11个位置(从0开始)的字符,即字符 B。
current = codes.Substring(nextDigit, 1) +
最后,完成的代码如下:
int amount = int.Parse(number.Text);
steps.Text = &&;
string current = &&;
string codes = &ABCDEF&;&// 设置16进制转换编码表
&& int nextDigit = amount % 16;
&& amount /= 16;
&& current = codes.Substring(nextDigit, 1) + &// 查表转换
&& steps.Text += current + &\n&;&
} while (amount != 0);
思考:请你写一个方法Conversion,它接收两个参数,一个是将转换到其它进制的整数number,一个是转换的进制system(取值2-36之间)。该方法返回整数number在进制system下对应的数据的字符串表示形式,如:Conversion()= &5B540&。"0xFF" 这种字符串?
已有帐号?
无法登录?
社交帐号登录

我要回帖

更多关于 c 十六进制转字符串 的文章

 

随机推荐