字符串中16进制数据转换成字符串,该如何处理
字符串中16进制数据转换成字符串
例如:
char str[] = "EB4D67E8F2FCE45F613144876EF8D1B9";
转换为: str[] = {0xeb,0x4D,0x67,0xE8 ...}
------解决思路----------------------
------解决思路----------------------
作为一个C程序员,对
scanf,sscanf,fscanf
printf,sprintf,fprintf
这类函数的用法,还是要做到“拳不离手,曲不离口”的。
------解决思路----------------------
将每一个字符处理成对应16进制的数值,将数值高位和低位做逻辑加运算。示例如下:
const char str[] = "EB4D67E8F2FCE45F613144876EF8D1B9";
const int targLen = sizeof(str)*0.5;
unsigned char _CharTo16Num( const char c )
{
if( c<65 )
{
return c-48;//0-9
}
else
{
return c-65+10;// 10-15
}
}
void _converTest()
{
unsigned char targ[targLen]={};
for( int i=0,j=0;i< sizeof(str);i+=2,j++)
{
targ[j] = _CharTo16Num( str[i] )<<4
------解决思路----------------------
_CharTo16Num(str[i+1] );
printf("%x\t",targ[j]);
}
}
例如:
char str[] = "EB4D67E8F2FCE45F613144876EF8D1B9";
转换为: str[] = {0xeb,0x4D,0x67,0xE8 ...}
------解决思路----------------------
#include <stdio.h>
#include <string.h>
int s2h(const char *s, char *h)
{
int i, n;
char *p;
static unsigned char t[256] = {
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, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, /* 0-9 */
0,10,11,12,13,14,15, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* A-F */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0,10,11,12,13,14,15, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* a-f */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
p = h;
n = strlen(s);
if (n % 2) {
h[0] = t[(unsigned char)s[0]];
++p;
++s;
}
for (i = 0; i < n; i = i + 2) {
*(p++) = (t[(unsigned char)s[i]] << 4)
------解决思路----------------------
t[(unsigned char)s[i + 1]];
}
return (n + 1) / 2;
}
int
main(int argc, char *argv[])
{
char s[] = "EB4D67E8F2FCE45F613144876EF8D1B9";
char h[1024];
int i, n;
n = s2h(s, h);
for (i = 0; i < n; ++i) {
printf("%02x", (unsigned char)h[i]);
}
printf("\n");
return 0;
}
------解决思路----------------------
#include <stdio.h>
#include <string.h>
char str[100] = "EB4D67E8F2FCE45F613144876EF8D1B9";
char bin[50];
int i,v,L;
int main() {
L=strlen(str);
for (i=0;i<L/2;i++) {
sscanf(str+i*2,"%2X",&v);
bin[i]=(char)v;
printf("%02X ",(unsigned char)bin[i]);
}
return 0;
}
//EB 4D 67 E8 F2 FC E4 5F 61 31 44 87 6E F8 D1 B9
作为一个C程序员,对
scanf,sscanf,fscanf
printf,sprintf,fprintf
这类函数的用法,还是要做到“拳不离手,曲不离口”的。
------解决思路----------------------
将每一个字符处理成对应16进制的数值,将数值高位和低位做逻辑加运算。示例如下:
const char str[] = "EB4D67E8F2FCE45F613144876EF8D1B9";
const int targLen = sizeof(str)*0.5;
unsigned char _CharTo16Num( const char c )
{
if( c<65 )
{
return c-48;//0-9
}
else
{
return c-65+10;// 10-15
}
}
void _converTest()
{
unsigned char targ[targLen]={};
for( int i=0,j=0;i< sizeof(str);i+=2,j++)
{
targ[j] = _CharTo16Num( str[i] )<<4
------解决思路----------------------
_CharTo16Num(str[i+1] );
printf("%x\t",targ[j]);
}
}