文档章节

c++ string 中的十六进制数字转十六进制字符

lake_r
 lake_r
发布于 2016/03/31 10:20
字数 343
阅读 1269
收藏 1

c++ string 中的十六进制数字转十六进制字符

问题描述

在做透传控制时,设备控制指令需要编写在xml文件中,由于摄像头控制指令一般都是十六进制,所以从xml文件中读取后会变成string字符串,实际的使用过程中需要转换一下,把两个字节的字符转成1个字节的十六进制。

例如 std::string str="1A023B4D",没有任何分隔符,如何获取这个十六进制字符串。然后转换成unsigned char 的数组。

转化后如下:

unsigned char tmp[512]={0};
tmp[0] = 0x1A
tmp[1] = 0x02
...

##代码

static unsigned int hex_char_to_dec(char c)
{
	if ('0' <= c && c <= '9')
	{
		return (c - '0');
	}
	else if ('a' <= c && c <= 'f')
	{
		return (c - 'a' + 10);
	}
	else if ('A' <= c && c <= 'F')
	{
		return (c - 'A' + 10);
	}
	else
	{
		return -1;
	}
}

static unsigned int str_to_hex(const unsigned char *str)
{
	return (str[1] == '\0') ? hex_char_to_dec(str[0]) : hex_char_to_dec(str[0])*16 + hex_char_to_dec(str[1]);
}

int  strhex_parse_hex(std::string in,unsigned char *out)
{
	unsigned char hex_str[512] = { 0 };
	unsigned char tmp[2] = { 0 };
	unsigned int len = in.size() / 2;
	for (int i = 0; i < len; i++)
	{
		int idx = i * 2;
		tmp[0] = in.at(idx);
		tmp[1] = in.at(idx+1);
		out[i] = (unsigned char)str_to_hex(tmp);
	}
	return len;
}
int main(int argc,char **argv)
{
	std::string str = "11121301";
    unsigned char buffer[512] = {0};
    int len = strhex_parse_hex(str, buffer);
    for(int i = 0; i < len; i++)
    {
    	printf("%02X", buffer[i]);
    }
    printf("\n");
	return 0;
}

© 著作权归作者所有

共有 人打赏支持
上一篇: jthread 介绍
下一篇: valgrind 运行出错
lake_r
粉丝 82
博文 155
码字总数 72374
作品 0
朝阳
后端工程师
私信 提问
C语言编程新手入门基础学习字符串操作总结超精细快收藏

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
2018/03/16
0
0
关于JNI返回十六进制字符串到JAVA层的说明

由于java层使用的是unicode编码方式即UTF-16,而c/c++本地代码使用的是UTF-8编码方式,所以在JNI层返回16进制字符串的问题比较难搞,不多说,直接粘码: JAVA部分代码: public class MainA...

wangjian19
2014/04/04
0
0
「译」C++ 中 0 是十进制还是八进制?

原文:Is 0 a decimal literal or an octal literal? 译文:C++ 中 0 是十进制还是八进制? 译者:justjavac C++ 中 0 是十进制还是八进制? 虽然在任何进制数种, 0 只有一个值——那就是「...

justjavac
2013/03/05
507
4
C++ Primer Plus(六)——分支语句和逻辑运算符

将表达式variable==value反转为value==variable,以此来捕获将相等运算符误写为赋值运算符的错误很有效。 一般来说,编写能让编译器能够发现错误的代码,比找出导致难以理解的错误的原因要容...

吃一堑消化不良
2015/11/20
0
0
delphi实现十进制与十六进制之间的转化

最近在下班业余时间学习下delphi和C++,用delphi写界面,C++写核心代码,希望以后可以用delphi和c++写一些自己的程序出来,也是最近才学到运算符于是写了2个小程序以巩固学的东西,此文章就暂时贴...

wbf961127
2017/11/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Httpd 整合 Tomcat 步骤

环境:Tomcat8 + Httpd2.4 工作原理:借助于Tomcat的AJP连接器实现Apache与Tomcat的通信 配置步骤: 1. 配置httpd.conf 新增: Include conf/extra/mod_jk.conf 修改:添加 index.jsp <IfM...

ZeroneLove
昨天
1
0
Docker笔记3——容器命令(未写完,明天整理接着写)

未写完,明天整理接着写 新建并启动容器 docker run docker run [OPTIONS] IMAGE [COMMEND] [ARG...] OPTIONS: --name=[容器新名字] :为容器指定一个名称 -d:后台运行容器,并返回容器ID,...

HappyBKs
昨天
1
0
2018个人年终总结

感谢领导的信任和指导,新的一年获得了很多成长和提高,改掉了很多不好的习惯。 在这一年里,我在领导的帮助下,主要完成了以下功能: 1、完成上海银行版本投资营销相关功能的开发。 2、完成车...

万山红遍
昨天
9
0
保密工作与linux系统的发展

保密工作从性质上可以分成商业方面的保密和国家安全方面的保密。由于自己从事的是IT方面的工作,工作中必然会接触涉及到计算机信息方面的相关文件。加上单位已近通过武器装备科研生产单位二级...

linux-tao
昨天
2
0
Spark共享变量

概述 Spark程序的大部分操作都是RDD操作,通过传入函数给RDD操作函数来计算。这些函数在不同的节点上并发执行,但每个内部的变量有不同的作用域,不能相互访问,所以有时会不太方便,Spark提...

仟昭
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部