C语言中十六进制字符数组转化为字符串

假设我定义
unsigned char yy[8]={0x11,0x22,0x33,0x44,0xAA,0xBB,0xCC,0xDD}; ,
unsigned long data1,data2;
然后怎么定义可以使得data1=0x11223344;data2=0xAABBCCDD;
求大神帮忙写下程序,C语言的。

#include <stdio.h>

unsigned char  s_des[100] = {0};

int length  = 9;

unsigned char s_src[length]  =  {0xFE,0x01,0x52,0xFF,0xEF,0xBA,0x35,0x90,0xFA};

unsigned char IntToHexChar(unsigned char c)

{

if (c > 9)

return (c + 55);

else

return (c + 0x30);

}

int main()

unsigned char temp;

int i;

for (i=0; i<length; i++) 

{

temp = s_src[i]&0xf0;

s_des[2*i] = IntToHexChar(temp >> 4);

temp = s_src[i]&0x0f;

s_des[2*i+1] = IntToHexChar(temp);

}

printf("*** %s ***\n",s_des);

return 0;

}

扩展资料:

十六进制表示方式

不同电脑系统、编程语言对于16进制数值有不同的表示方式:

Ada与VHDL用所基于的“数字引证”把16进制数包起来,例如“16#5A3#”。(注:Ada对整数和实数都可以使用从1到16中任何一个做为其基数。)而对于字节向量,VHDL使用字首x表示,例如,x"10",对应的二进制码为:"00010000"。

C语言、C++、Shell、Python、Java语言及其他相近的语言使用字首“0x”,例如“0x5A3”。开头的“0”令解析器更易辨认数,而“x”则代表十六进制(就如“O”代表八进制)。在“0x”中的“x”可以大写或小写。对于字符量C语言中则以x+两位十六进制数的方式表示,如xFF。

十六进制转义序列:如\x1abf4,可以使用任意多的十六进制数字,直至不是十六进制数字为止;

16位的通用字符名(universe-character name):\u后面必须跟4个十六进制数字(不足四位前面用零补齐),表示Unicode中在0至0xFFFF之内的码位(但不能表示0xD800到0xDFFF之内的码点,Unicode标准规定这个范围内的码位保留,不表示字符);

32位的通用字符名:\U后面必须跟8个十六进制数字(不足八位前面用零补齐),表示Unicode中所有可能的码位(除0xD800到0xDFFF之外)。

C++11引进了十六进制浮点型字面常量。例如:0x1.2p10表示(1+2/16)×2=115210。实际上,Visual C++一直以来使用的C/C++语言标准库函数printf,%a作为类型说明符来格式化输出浮点型值即为上述格式。例如:printf("%a",1152.0);

C/C++在表示字符型字面常量时,可以用:

在VB、MSX BASIC、Quick BASIC和FreeBASIC中,使用字首“&H”来表示。

在HTML,十六进制字元可以用“x”,例如&#x5a3;和֣效果应该无异。

Intel的汇编语言中用字尾“h”来标识16进位的数(若该数以字母起首,在前面会增加一个“0”)例如“0A3Ch”、“5A3h”

其他汇编器(AT&T、Motorola、6502),Pascal,Delphi和某些BASIC的版本使用字首“$”,例如“$5A3”

亦有用X'5A3'这类表示方式的,如于PL/I,COBOL及JCL中。这亦是IBM装载早期操作系统的大型机与小型机上最常用的数据格式。

由于表示方式没有单一、已协定的标准,所以以上的表示方式都有被使用,有时甚至在同一份论文上会出现几个不同的表示方式。但因为各方式之间没有太大的分歧,所以即使混合使用也没有构成问题。

其中最常用(或常见)表示十六进制数值的方式是将'0x'加在数字前,或在数字后加上小字16。例如0x2BAD和2BAD16都是表示十进制的11181(或1118110)。

在网页设计上十六进制是很常用的。HTML和CSS使用十六进制的表示法来表示网页上的特定颜色。使用#的符号来表示而非用个别的符号表示十六进制。

24-bit颜色可以用#RRGGBB的格式来表示,RR是颜色中红色成分的数值,GG是颜色中绿色成分的数值,BB颜色中蓝色成分的数值。举个例子,红色的阴影是十进制238,9,63可以编成#EE093F。

参考资料:

百度百科——十六进制

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-04-28

代码如下:

void ByteToHexStr(const unsigned char* source, char* dest, int sourceLen)

{

short i;

unsigned char highByte, lowByte;

for (i = 0; i < sourceLen; i++)

{

highByte = source[i] >> 4;

lowByte = source[i] & 0x0f ;

highByte += 0x30;

if (highByte > 0x39)

dest[i * 2] = highByte + 0x07;

else

dest[i * 2] = highByte;

lowByte += 0x30;

if (lowByte > 0x39)

dest[i * 2 + 1] = lowByte + 0x07;

else

dest[i * 2 + 1] = lowByte;

}

return ;

}

扩展资料

字符串是一种非常重要的数据类型,但是C语言不存在显式的字符串类型,C语言中的字符串都以字符串常量的形式出现或存储在字符数组中。同时,C 语言提供了一系列库函数来对操作字符串,这些库函数都包含在头文件 string.h 中。

字符串常量与指针关系密切,因为字符串常量的值,实际上表示的是存储这些字符的内存空间的地址,更准确地说是字符串常量中第 1 个字符的地址,而不是这些字符本身。因此,在 C 语言中是不能直接进行字符串赋值的(因为没有字符串类型嘛)。

在 C 语言中,常通过声明一个指向 char 类型的指针并将其初始化为一个字符串常量的方式来访问一个字符串。

本回答被网友采纳
第2个回答  推荐于2018-03-13

可以直接用memcpy函数把yy往data1,data2里面拷贝就行了。

但是,由于long类型占用超过2字节,所以这里会涉及到CPU字节序的问题。

通常我们用的windows机器都是小端序的,所以,示例代码如下:

#include <stdio.h>
#include <string.h>
//#include <winsock.h>
//下面这个是自己写的字节序翻转宏
#define
CONVERT_INT4(m)   ((((m)&0xff000000)>>24) +
(((m)&0x00ff0000)>>8) +
(((m)&0x0000ff00)<<8)+(((m)&0x000000ff)<<24))

int main(int argc, char *argv[])
{
        unsigned char yy[8] = {0x11,0x22,0x33,0x44,0xAA,0xBB,0xCC,0xDD};
        unsigned long data1, data2;
        memcpy(&data1, yy, 4);
        memcpy(&data2, yy + 4, 4);
        printf("0x%X, 0x%X\n", data1, data2);

        //data1 = htonl(data1);//使用系统函数转换字节序
        //data2 = htonl(data2);

        data1 = CONVERT_INT4(data1);//使用自定义宏转换字节序
        data2 = CONVERT_INT4(data2);
        printf("0x%X, 0x%X\n", data1, data2);

       
        return 0;
}

输出:

可以看到,拷贝完成之后,字节序和你想要的是反的,所以,要把它转换成你想要的字节序。

使用自定义的宏比较方便,你也可以使用htonl函数来转换,但是要包含#include <winsock.h>头文件,编译的时候如果报链接错误,还要添加链接库。

追问

这data1是个十六进制浮点数,怎么用函数计算成十进制浮点数呢?不是把这十六进制转化成十进制再变成浮点数啊 是这个十六进制本身就是PLC发给我的浮点数,前四位是高位,后四位是低位 这个算附加的问题 对了的话我追加50财富

追答

只是转成浮点数的话直接把转换好的data1,data2赋值给double就行了,float可能会溢出。代码:

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

#define CONVERT_INT4(m)   ((((m)&0xff000000)>>24) + (((m)&0x00ff0000)>>8) + (((m)&0x0000ff00)<<8)+(((m)&0x000000ff)<<24))

int main(int argc, char *argv[])
{
        unsigned char yy[8] = {0x11,0x22,0x33,0x44,0xAA,0xBB,0xCC,0xDD};
        unsigned long data1, data2;
        double d1,d2;

        memcpy(&data1, yy, 4);
        memcpy(&data2, yy + 4, 4);
        printf("0x%X, 0x%X\n", data1, data2);

        data1 = htonl(data1);
        data2 = htonl(data2);

        //data1 = CONVERT_INT4(data1);
        //data2 = CONVERT_INT4(data2);
        printf("0x%X, 0x%X\n", data1, data2);
        d1 = data1;//直接赋值
        d2 = data2;
        //需要使用%u输出无符号数的data1,data2

        //因为data2如果是有符号的数,已经溢出,%d输出会是个负数

        printf("%u[%f], %u[%f]\n", data1, d1, data2, d2);
        return 0;
}

运行结果:

追问

不是这个意思 比如427A199A这个十六进制浮点数吧,42是高位高字,7A是高位低字,19是低位高字,9A是低位低字,代表的是个浮点数,(按我的理解前四位是整数,后四位是小数)换算成十进制浮点数是62.525左右,是个浮点数的换算,不知道怎么换算。

追答

你这个理解可能有问题啊,你62.252这个数字是怎么算出来的?而且这种编码的方式也比较奇怪,你要把编码规则搞清楚才好处理,比如浮点数的整数部分和小数部分是不是分开的,你得到数据之后是不是分开计算,然后合在一起作为一个浮点数,比如说11223344这个,1122是整数部分,转换成10进制是4386,3344是小数部分,转换成10进制是13142,合起来就是4386.13142这样子。否则算起来就麻烦了。可以私信把QQ发我,具体讨论。

追问

QQ已发

本回答被提问者和网友采纳
第3个回答  2020-11-20

C语言_012_十六进制转十进制

第4个回答  2014-03-12

不用自己写那么多代码吧 ... C 库有好用的函数 ...

char data1[ 512 ]= { 0 };
char data2[ 512 ]= { 0 };
char temp[ 52 ] = { 0 };


for( int i = 0; i < 4 ) 
{
    itoa_s( temp, sizeof( temp ), yy[ i ], 16 );
    strcat( data1, temp );
}


for( int i = 4; i < 8 ) 
{
    itoa_s( temp, sizeof( temp ), yy[ i ], 16 );
    strcat( data2, temp );
}

 

修改了一下,itoa 用了安全版本,新增了第二个缓冲区大小参数

相似回答