字符串中16进制数据转换成字符串

wain_ 2014-09-19 11:35:40
例如:
char str[] = "EB4D67E8F2FCE45F613144876EF8D1B9";
转换为: str[] = {0xeb,0x4D,0x67,0xE8 ...}


...全文
173 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wain_ 2014-09-22
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
#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 这类函数的用法,还是要做到“拳不离手,曲不离口”的。
老师,再请教十六进制转换成字符串,怎样,下面写得有哪里不合适吗?

char buf[10];
char bin[50] = {0x,ab,0xbc,0xcd};
char str[100];
len = strlen(bin);
 for (i = 0; i < len; i++) {
       sprintf(buf,"%s",bin[i]);
        strcat(str,buf);
}
赵4老师 2014-09-22
  • 打赏
  • 举报
回复
char bin[50] = {0xab,0xbc,0xcd};
char str[100];
for (i = 0; i < 3; i++) {
    sprintf(str+i*2,"%02X",(unsigned char)bin[i]);
}
C4Fun 2014-09-19
  • 打赏
  • 举报
回复
将每一个字符处理成对应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]); } }
赵4老师 2014-09-19
  • 打赏
  • 举报
回复
#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 这类函数的用法,还是要做到“拳不离手,曲不离口”的。
mymtom 2014-09-19
  • 打赏
  • 举报
回复

#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;
}
赵4老师 2014-09-19
  • 打赏
  • 举报
回复
引用 6 楼 mymtom 的回复:
[quote=引用 2 楼 zhao4zhong1 的回复:]
#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 这类函数的用法,还是要做到“拳不离手,曲不离口”的。
从来不用scanf的路过[/quote] 乍看起来c++的cin、cout在输入、输出上比c的scanf、printf简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout! 使用scanf、printf。 试试不用scanf实现和下面程序功能完全一样的功能:
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%d%n",&v,&n);
        printf("k,v,n=%d,%d,%d\n",k,v,n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.
mymtom 2014-09-19
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
#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 这类函数的用法,还是要做到“拳不离手,曲不离口”的。
从来不用scanf的路过
wain_ 2014-09-19
  • 打赏
  • 举报
回复
多谢各位回复
wain_ 2014-09-19
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
#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 这类函数的用法,还是要做到“拳不离手,曲不离口”的。
多谢老师指教

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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