二进制与16进制直接相互转换

news/2024/7/24 2:51:27 标签: 算法

数据转换函数实现

  • 二进制字符串转16进制值
  • 二进制文本数组转16进制数组
  • 16进制转16进制字符
  • 16进制数组转16进制字符串
  • 16进制字符串转2进制字符串
  • 测试demo

二进制字符串转16进制值

 /**
 * @brief		二进制文本转16进制.
 * @details	    这个函数实现输入2进制文本,转换输出16进制值
 * @param[in]	dat_in  输入的2进制文本数据
 * @param       dat_in 一次最多处理8位
 * @retval		转换后的16进制数据
 * @par 标识符
 * 		保留
 * @par 其它
 * 		无
 * @author 作者最美好的在初见
 */

unsigned char binary_to_hex_value(void * dat_in){ //binary to hex data 
	unsigned char    *pdata;
	unsigned char binary_size = 0;
	unsigned char i=0, hex = 0;
	pdata = dat_in;
	binary_size = strlen(dat_in);
	if(binary_size>8)binary_size = 8;
	for( i=0; i< binary_size;i++ ){
	   if(pdata[i]== '1'){
	    hex = (hex *2) +1;
	   }else if(pdata[i]== '0'){
	    hex = (hex *2) ;
	   }
	}
	return  hex ;
}

二进制文本数组转16进制数组

 /**
 * @brief		二进制文本转16进制数组.
 * @details	    这个函数实现输入2进制文本,转换输出16进制数组
 * @param[in]	binary_in  输入的2进制文本数据
 * @param[in]	head 进行转换的起始位置
 * @param[in]	tail 进行转换的结束位置
 * @param[out]	hex_out 输出转换完成的16进制数组
 * @param       注意当输入tail 超过二进制数据长度时,会自动去除超出部分,再进行转换
 * @retval		转换后的16进制数据
 * @par 标识符
 * 		保留
 * @par 其它
 * 		无
 * @author 作者最美好的在初见
 */
int binary_to_hexValue(void * hex_out,void * binary_in, unsigned short head, unsigned short tail){
	unsigned char    *pdataIn;
	unsigned char    *pdataOut;
	unsigned char    *pdata;
	unsigned char binary_size = 0;
	unsigned char index = 0;
	pdataIn = binary_in;
	binary_size = strlen(binary_in);
	if(binary_size>tail) tail = binary_size; //不允许超限
	pdata = pdataIn + head;
	if((tail - head)%8==0){
	index = (tail - head)/8;
	}else {
	index = ((tail - head)/8)+1 ;
	}
	while(index--){
	binary_to_hex_value(pdata);
	}
	return 0;
}

16进制转16进制字符


 /**
 * @brief		16进制数转16进制字符
 * @details	    函数事输入16单字节16进制输出16进制字符
 * @param[in]	hex 需要转换的数据
 * @param[out]	out 转换结果输出
 * @param       
 * @retval		
 * @par 标识符
 * 		保留
 * @par 其它
 * 		无
 * @author 作者最美好的在初见
 */
int hex_to_hexChar(unsigned char hex,void * out){
   
	unsigned char dat_H = 0;
	unsigned char dat_L = 0;
	unsigned char *pdata =out ;
	
	dat_H = hex/16;
	dat_L = hex%16;
	pdata = out;
	
	//printf("HEX H= %02x --L= %02x\r\n",dat_H ,dat_L);
	
	if(dat_H>=0x0A){
	  pdata[0] = (dat_H-10) +'A';
	}else {
	  pdata[0] = dat_H +'0';
	}
	if(dat_L>=10){
	  pdata[1] = (dat_L-10) +'A';
	}else {
	  pdata[1] = dat_L +'0';
	}
	return 0;
}

16进制数组转16进制字符串


 /**
 * @brief		16进制数组数转16进制字符串
 * @details	    16进制数组转换成16进制字符串
 * @param[in]	hex_buff 需要转换的字符串
 *              len 需要转换的长度
 * @param[out]	hex_out_str 转换结果输出
 * @param       
 * @retval		
 * @par 标识符
 * 		保留
 * @par 其它
 * 		无
 * @author 作者最美好的在初见
 */

int hex_to_hexstring(void * hex_out_str,void * hex_buff, unsigned short len){
	unsigned char i=0;
	unsigned char buff[3]="\0";
		unsigned char    *pdataIn;
	unsigned char    *pdataOut;
	pdataIn = hex_buff;
	pdataOut = hex_out_str;
	for( i=0; i< len;i++ ){
		buff[2]= '\0';
		hex_to_hexChar(pdataIn[i],buff);
		pdataOut[2*i] = buff[0];
		pdataOut[2*i+1] = buff[1];
		pdataOut[2*i+2] ='\0';
	}
	return 0;
}

16进制字符串转2进制字符串

 /**
 * @brief		16进制字符串转二进制字符串
 * @details	    
 * @param[in]	hexstr  需要转换的字符串
 * @param[out]	binary_out 转换结果输出
 * @param       
 * @retval		
 * @par 标识符
 * 		保留
 * @par 其它
 * 		无
 * @author 作者最美好的在初见
 */

int hex_to_ninary(void *hexstr ,void*binary_out){
	unsigned short i = 0,j =0;
	unsigned char    hex_char = 0;
	unsigned char    hex_value = 0;
	unsigned short   len = 0;
	unsigned char    *P_in;
	unsigned char    *P_out;
	P_in = hexstr;
	P_out = binary_out;
	
	len = strlen((unsigned char*)hexstr);
  for(i = 0;i<len;i++){
         hex_char = (unsigned char)P_in[i];
		 if(hex_char == ' '||hex_char == '\r'||hex_char == '\n'){
			continue;
		  }
		  if(hex_char>= '0' &&hex_char<= '9'){
            hex_value =  hex_char -'0';
		  }else if(hex_char>= 'A' &&hex_char<= 'F'){
             hex_value =  hex_char -'A'+10;
		  }else if(hex_char>= 'a' &&hex_char<= 'f'){
            hex_value =  hex_char -'a'+10;
		  }else{
              return -1;
		  }
		for(j= 0;j<4;j++){
			if(hex_value&0x08){
			P_out[4*i+j] = '1';
			}else {
			P_out[4*i+j] = '0';
			}
			hex_value = (hex_value *2)&0x0f;
	
			 P_out[4*i+j+1] = '\0';
		}
  }
	return 0;
}

测试demo

int main()
{
   /*  Write C code in this online editor and run it. */
	char buff_in[] = "1111000011110000101010100011110000111111111111111";
	char buff_out[50] = "";
	char hexbuff[50] = {0X33,0X44,0X55,0X66,0X55,0X66,0X55,0X66,0X55,0X66,0X55,0X88};
	
	int size_date = 0;
	   printf("buff_in  ---》 | %s\n",buff_in);
	hex_to_hexChar(binary_to_hex_value("10101111"),buff_out);
	printf("hex  [%s]\n",buff_out);
   hex_to_hexstring(buff_out,hexbuff,15);
   	printf("hexstring  [%s]\n",buff_out);
   return 0;
}

http://www.niftyadmin.cn/n/5170881.html

相关文章

【Python小练手】使用PySimpleGUI和Pygame创作一个MP3播放器(附完整代码)

文章目录 前言一、来说说思路&#xff08;文心一言提供&#xff09;二、完整代码&#xff08;参考文心&#xff0c;自行修改&#xff09;总结附录 前言 闲来无事&#xff0c;做了MP3播放器练练手&#xff0c;主要是研究下PySimpleGUI的界面窗口设计。先上图&#xff0c;一睹为…

为什么单片机内不继承晶振

一、晶振是什么&#xff1f;有什么作用&#xff1f; 晶振&#xff08;Crystal Oscillator&#xff09;是一种基于晶体材料的振荡器&#xff0c;用于提供稳定的振荡信号。晶体是一种可通过机械振动在电场作用下产生相应电压的物质。晶振由晶体与电路共同组成&#xff0c;晶体负责…

企业如何解决被“薅羊毛”

随着互联网的普及和电子商务的兴起&#xff0c;越来越多的消费者选择在线购物。然而&#xff0c;一些消费者可能会利用企业的促销活动或优惠券来获取额外优惠&#xff0c;甚至恶意攻击企业的营销资金。这种行为被形象地称为“薅羊毛”。 对于企业而言&#xff0c;如何解决被“薅…

Windows下Python及Anaconda的安装与设置之保姆指南

学习Python编程需要安装基本的开发环境。 &#xff08;1&#xff09;python ——编译器&#xff1b;这个是任何语言都需要的&#xff1b;必需&#xff01; &#xff08;2&#xff09;Anaconda ——主要的辅助工具&#xff0c;号称是 Python‘OS&#xff1b;必需&#xff01; …

C++ 字符串学习资料

C 字符串学习资料 目录 什么是字符串&#xff1f;字符串的声明和初始化字符串的常见操作字符串的输入和输出字符串的比较和连接字符串的搜索和替换字符串的转换和子串提取 什么是字符串&#xff1f; 在 C 中&#xff0c;字符串是由字符组成的序列&#xff0c;用于表示文本数…

Android底层开发Quick Start

[Kernel配置文件] 根据编译产物out/target/product/trinket/obj/kernel/msm-4.14/.config的宏CONFIG_ARCH_TRINKET kernel/msm-4.14/arch/arm64/configs$ grep -rin CONFIG_ARCH_TRINKET 找到 kernel/msm-4.14/arch/arm64/configs/vendor/trinket-perf_defconfig kernel/msm-4.…

AI系统ChatGPT源码+详细搭建部署教程+AI绘画系统+支持GPT4.0+Midjourney绘画+已支持OpenAI GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…