| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1735 人关注过本帖
标题:字符串如何转换为十六进数?
只看楼主 加入收藏
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 

忙里偷闲,写了一个玩,代码风格有点过于正规,看不顺眼可以自己改
[CODE]void atox(char * szStr, unsigned int ** ppulHex, unsigned int * pulLength)
{
char szTmp[9];
int iCount = (strlen(szStr) / 8) + (strlen(szStr) % 8 > 0 ? 1 : 0);
int i, iLeft = strlen(szStr);
unsigned int * pulHex = NULL;
memset(szTmp, 0, sizeof(szTmp));
pulHex = new unsigned int[iCount];
if (! pulHex)
{
* ppulHex = NULL;
return;
}
for (i = 0; i < iCount; i ++)
{
strncpy(szTmp, szStr, 8 > iLeft ? iLeft : 8);
szTmp[szStr, 8 > iLeft ? iLeft : 8 + 1] = 0;
sscanf(szTmp, "%x", &pulHex[i]);
szStr += 8;
iLeft -= 8;
}
* ppulHex = pulHex;
* pulLength = iCount;
}[/CODE]


世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-10-19 15:41
Meixu
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2006-10-12
收藏
得分:0 
以下是引用aogun在2006-10-19 15:41:40的发言:

忙里偷闲,写了一个玩,代码风格有点过于正规,看不顺眼可以自己改
[CODE]void atox(char * szStr, unsigned int ** ppulHex, unsigned int * pulLength)
{
char szTmp[9];
int iCount = (strlen(szStr) / 8) + (strlen(szStr) % 8 > 0 ? 1 : 0);
int i, iLeft = strlen(szStr);
unsigned int * pulHex = NULL;
memset(szTmp, 0, sizeof(szTmp));
pulHex = new unsigned int[iCount];
if (! pulHex)
{
* ppulHex = NULL;
return;
}
for (i = 0; i < iCount; i ++)
{
strncpy(szTmp, szStr, 8 > iLeft ? iLeft : 8);
szTmp[szStr, 8 > iLeft ? iLeft : 8 + 1] = 0;
sscanf(szTmp, "%x", &pulHex[i]);
szStr += 8;
iLeft -= 8;
}
* ppulHex = pulHex;
* pulLength = iCount;
}[/CODE]


这段代码不知是如何把字符串代入这个atox 函数的。


多看、多练、多写
2006-10-19 20:14
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 

[CODE]int main(void)
{
char str[]="1234567890ABCDEF1234567890ABCDEFA";
unsigned int * pHex = NULL;
unsigned int ulLength = 0, i;

atox(str, &pHex, &ulLength);

if (pHex)
{
for (i = 0; i < ulLength; i ++)
{
printf("0x%x\n", pHex[i]);
}
delete []pHex;
}
return 0;
}[/CODE]

注意:如果输入的字符串不是8的倍数,那么最后剩下的字符串如果是AB的话,将按照0x000000AB来处理,而不是0xAB000000,如果如果你期望的是后一种,那么需要在代码中进行一定的更改,另外,注意上面的红色代码部分,也就是说返回的指针的内存需要自己释放


世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-10-20 09:02
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
收藏
得分:0 
szTmp[szStr, 8 > iLeft ? iLeft : 8 + 1],这个是什么意思呢,
szTmp[9]为什么不是szTmp[8]呢

[此贴子已经被作者于2006-10-20 11:05:32编辑过]


2006-10-20 10:58
Meixu
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2006-10-12
收藏
得分:0 
szTmp[szStr, 8 > iLeft ? iLeft : 8 + 1]是否可以把这行改为
szTmp[8 > iLeft ? iLeft : 9]或者szTmp[8 > iLeft ? iLeft : 8]
这几个结果显示好像是一个结果。


又在程序上增加了几行(让它更实用一点):
#define STRNUM 50

int main(void)
{
char str[STRNUM];
scanf("%s",str);
}
这样加不知怎么样?

[此贴子已经被作者于2006-10-20 13:49:51编辑过]


多看、多练、多写
2006-10-20 13:29
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
收藏
得分:0 
回楼上
可以的
这个szStr, 8 > iLeft ? iLeft : 8 + 1是逗号运算

2006-10-20 14:05
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
szTmp[szStr, 8 > iLeft ? iLeft : 8 + 1]
这句话的意思是:我写错了
应该是szTmp[8 > iLeft ? iLeft : 8],抱歉,当时没仔细看,写得快了点,呵呵
其实如果可以保证输入的字符串的数量是8的倍数这句话是可以不要的

世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-10-20 16:26
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
收藏
得分:0 
以下是引用aogun在2006-10-20 16:26:39的发言:
szTmp[szStr, 8 > iLeft ? iLeft : 8 + 1]
这句话的意思是:我写错了
其实也没错,有逗号运算符在
估计是偷懒,直接从上一行copy过来的

2006-10-20 19:26
Meixu
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2006-10-12
收藏
得分:0 

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#define STRNUM 50

void atox(char * szStr, unsigned int ** ppulHex, unsigned int * pulLength)
{
char szTmp[3];
int iCount = (strlen(szStr) / 2) + (strlen(szStr) % 2 > 0 ? 1 : 0);
int i, iLeft = strlen(szStr);
unsigned int * pulHex = NULL;
memset(szTmp, 0, sizeof(szTmp));
pulHex = new unsigned int[iCount];
if (! pulHex)
{
* ppulHex = NULL;
return;
}
for (i = 0; i < iCount; i ++)
{
strncpy(szTmp, szStr, 2 > iLeft ? iLeft : 2);
szTmp[2 > iLeft ? iLeft : 2] = 0;
sscanf(szTmp, "%x", &pulHex[i]);
szStr += 2;
iLeft -= 2;
}
* ppulHex = pulHex;
* pulLength = iCount;
}

int main(void)
{
char str[STRNUM];
scanf("%s",str);
unsigned int * pHex = NULL;
unsigned int ulLength = 0, i;
atox(str, &pHex, &ulLength);
if (pHex)
{
for (i = 0; i < ulLength; i ++)
{
printf("0x%x\n", pHex[i]);
}
delete []pHex;
}
return 0;
}
通过这个程序学习了不少知识:
1、逗号运算符“,”,条件运算符“?:”,长度运算符“sizeof”,地址与运行符“&”,还有就是指向指针的指针等。
2、学习了strlen、memset、strncpy、sscanf、new和delete这些函数等。
程序稍微改了一下实现只取2位数的十六进制数,这里还谢谢aogun版主。

[此贴子已经被作者于2006-10-20 22:12:22编辑过]


多看、多练、多写
2006-10-20 22:06
快速回复:字符串如何转换为十六进数?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029999 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved