string char* 16进制数字转化 unsigned char* 转化 字符串拼接

C++ string全面指南:从basic_string设计到性能优化实战 在C++编程中,字符串处理是基础且高频的操作,其核心在于理解字符串类的设计原理与内存管理机制。字符串本质上是一种序列容器,通过模板化的basic_string类实现,支持多种字符类型和编码方式。掌握其内存分配策略(如容量预留)和操作特性,能显著提升程序性能,避免常见陷阱如c_str()指针失效。在实际开发中,字符串拼接、分割、类型转换等场景对性能影响较大,合理运用string_view和移动语义等技术可减少不必要的拷贝。本文聚焦C++ string类的深度解析,涵盖从设计哲学到编码实践的全方位内容,帮助开发 阅读详情

   项目中用到了16进制数字的转化 , 但是输出的是通过sha1加密,字符是两两转化为16进制数,要求是将其连接起来发送成一个字符串。


首先 要用到string时需要加载相关的头文件

#include <stdlib.h>
#include<cstdlib> 



#include<cstdio>

#include <string.h>

#include<string>

using namespace std;


我用的是VS2012 

当int 型数转化为char 型数组时用的是 _itoa_s()函数(itoa好像在这个版本总不能用)

 _itoa_s()总有三个参数,第一个转化的整形数,第二个是要转化出来的字符串数组,第三个int值是转化成多少进制,10进制就填10,16进制就填16

举例:

int number=205;
	char string[100];
	_itoa_s(number,string,16);
	printf("string=%s\n",string);
将char 型字符串数组转化为int型用的是sscanf函数,也是转化为16进制数

举例

char a[]="2e3df";
		int b;
	sscanf(a,"%x",&b);
	printf("\n\n\n%x",b);

后来发现是从无符号型char*转化 ,由于直接将unsigned char强制转换成char型发现最终得出的结果有问题(原因可能是unsigned char能表示0~255,而char表示的-128~127)

用了个比较笨的办法:就是先将unsigned char* 转换到整形,再从int整形转换到char型。

string SHA1::printdecode(unsigned char* c)
{
    unsigned char stringc[20];////无符号char型数组
	char outstring[20][20];//<span style="color:#ff0000;">char型数组,由于</span><span style="color: rgb(255, 0, 0); font-family: Arial, Helvetica, sans-serif;">_itoa_s()函数中间是字符串数组,因此此处用了二维数组</span><span style="color:#ff0000;">
</span>
	for(int n=0;n<20;n++)
	{
		stringc[n]=(unsigned char)*c;;
		


	//	printf("%02x",*c);
		c++;
	}
	printf("\n");
	for(int n=0;n<20;n++)
	{
	//	printf("%02x",stringc[n]);
		
		int value=(int)stringc[n];
	//	printf("%02x",value);

	_itoa_s(value,outstring[n],16);
	
	if(strlen(outstring[n])==1)
		{
		//	printf("length=======%d",strlen(outstring[n]));
			char zero[]="0";
			//printf("zero======%s,outdtring======%s",zero,outstring[n]);
			char k=outstring[n][0];
		
			//printf("zero======%s,outdtring======%s,k=========%c",zero,outstring[n],k);
			sprintf(outstring[n],"%s%c",zero,k);//<span style="color:#ff0000;">字符串拼接用的是<span style="font-family: Arial, Helvetica, sans-serif;">sprintf()函数</span></span>

		}
	
	//printf("string=%s\n",outstring[n]);
	

	}

	string lasrstring,arraystring;///输出字符串,数组字符串
	char laststring[100]={0};
	for(int i=0;i<20;i++)
	{
		

		sprintf(laststring,"%s%s",laststring,outstring[i]);
	}
	//printf("\n-------------------------\n%s\n",laststring);
	
	char *m=laststring;
	string s(m);
	return s;
	
	
}
此时在调用printdecode函数时,用printf打印结果时发现结果成了汉字,最后的解决方法是:

有一种情况我要说明一下。当我们定义了一个string类型之后,用printf("%s",s1);输出是会出问题的。这是因为“%s”要求后面的对象的首地址。但是string不是这样的一个类型。所以肯定出错。
用cout输出是没有问题的,若一定要printf输出。那么可以这样:
printf("%s",s1.c_str())


其他一些转换的资料

以下转载自:http://blog.youkuaiyun.com/cogbee/article/details/8931838

1、首先必须了解,string可以被看成是以字符为元素的一种容器。字符构成序列(字符串)。有时候在字符序列中进行遍历,标准的string类提供了STL容器接口。具有一些成员函数比如begin()、end(),迭代器可以根据他们进行定位。

注意,与char*不同的是,string不一定以NULL('\0')结束。string长度可以根据length()得到,string可以根据下标访问。所以,不能将string直接赋值给char*。

2、string 转换成 char *

如果要将string直接转换成const char *类型。string有2个函数可以运用。

一个是.c_str(),一个是data成员函数。

例子如下:

string s1 = "abcdeg";
const char *k = s1.c_str();
const char *t = s1.data();
printf("%s%s",k,t);
cout<<k<<t<<endl;

如上,都可以输出。内容是一样的。但是只能转换成const char*,如果去掉const编译不能通过。

那么,如果要转换成char*,可以用string的一个成员函数copy实现。

string s1 = "abcdefg";
char *data;
int len = s1.length();
data = (char *)malloc((len+1)*sizeof(char));
s1.copy(data,len,0);
printf("%s",data);
cout<<data;

3、char *转换成string

可以直接赋值。

string s;

char *p = "adghrtyh";

s = p;

不过这个是会出现问题的。

有一种情况我要说明一下。当我们定义了一个string类型之后,用printf("%s",s1);输出是会出问题的。这是因为“%s”要求后面的对象的首地址。但是string不是这样的一个类型。所以肯定出错。

用cout输出是没有问题的,若一定要printf输出。那么可以这样:
printf("%s",s1.c_str())


4、char[] 转换成string

这个也可以直接赋值。但是也会出现上面的问题。需要同样的处理。


5、string转换成char[]

这个由于我们知道string的长度,可以根据length()函数得到,又可以根据下标直接访问,所以用一个循环就可以赋值了。

这样的转换不可直接赋值。

    string pp = "dagah";
    char p[8];
    int i;
    for( i=0;i<pp.length();i++)
        p[i] = pp[i];
    p[i] = '\0';
    printf("%s\n",p);
    cout<<p;

C++ char*,const char*,string的相互转换

 
1. string转const char*

string s ="abc";
constchar* c_s = s.c_str();

2.  const char*转string
   直接赋值即可

constchar* c_s ="abc";
string s(c_s);

  3.  string转char*

string s ="abc";
char* c;
constint len = s.length();
c =newchar[len+1];
strcpy(c,s.c_str());

 

  4.  char*转string

char* c ="abc";
string s(c);

  5.  const char*转char*

constchar* cpc ="abc";
char* pc =newchar[100];//足够长
strcpy(pc,cpc)


C语言字符串与数字转换:从atoi到strtol的嵌入式实战指南 在C语言编程中,字符串与数字的相互转换是数据处理的基础操作,涉及内存解析、类型表示等核心原理。这一技术对于构建健壮、可靠的软件系统至关重要,尤其在嵌入式开发、通信协议解析、数据格式化等场景中广泛应用。理解不同转换函数的内在机制与安全边界,能有效避免数据错误、内存溢出等隐患。本文聚焦于`strtol`、`atoi`等关键函数,通过对比其错误处理能力与适用场景,深入探讨如何在资源受限的MCU环境中实现安全高效的转换,并涵盖进制处理、浮点数解析等实战技巧,为嵌入式工程师提供一套完整的避坑指南与最佳实践。 阅读详情

相关推荐

C++字符串字面量全解析:从编码到C++23新特性

字符串字面量是编程语言中表示文本数据的基础概念,其核心原理在于编译器将源代码中的字符序列转换为内存中的字节表示。在C++中,这一技术价值体现在类型安全、性能优化和跨平台兼容性上,特别是通过前缀(如u8、L、u、U)和后缀(如s)系统实现对不同字符编码(如UTF-8、UTF-16)和字符串类型(如std::string、std::string_view)的精确控制。随着C++20引入char8_t类型,UTF-8字符串获得了独立的类型标识,显著增强了类型安全性,而C++23进一步优化了转义序列语法。这些特性广

tyygming的专栏 190

C/C++ unsigned char*类型

C++ unsigned char *是表示无符号字符指针的意思。 细节如下: char 前面添加unsigned表示是无符号的字符,也就是不可以存储负数; 在数据类型后面加*表示指针的意思; 指针是C和C++的一种特色数据类型,可以方便的访问内存,也可以通过指针自己控制堆的分配与使用。 此外: 在C中,默认的基础数据类型均为signed,如定义变量为int,long等,都为有符号的。如果要定义无符号类型,必须显式地在变量类型前加unsigned。 char vs unsigned char 相同点:在内

Dontla的博客 1万+

苹果开发者账号( Apple Developer)登录出现:你的 Apple ID 暂时不符合使用此应用程序的条件(您的apple账户不符合资格)

Apple开发对于新手来说确实可能会遇到各种问题,在遇到 Apple Developer 账号登录问题时,除了检查账号的安全性设置和协议确认外,还需要考虑账号的具体配置问题,比如主邮箱的设置。

Winter_Sun灬的博客 4131

单片机c语言char拼接,单片机中unsigned char转字符串的方法

在单片机中,常用到数字与字符的方法,在C中都是使用itoa函数,C51也有这个函数,但是,8051的RAM是很有限的,所以尽量避免使用int型,常用的是unsigned char。当需要转换成字符串时用itoa的话,还是有点浪费。还是自力更生,自己写了一个,代码如下:typedef unsigned char BYTE;BYTE * ByteToStr(BYTE n){BYTE str[4];BY...

weixin_42509774的博客 1912

Vivado时序违约小结

目录1. setup time违约1.1 逻辑级数太高1.2 Fanout太大2. hold time 违约2.1 异步信号处理导致hold time违约 1. setup time违约 建立时间是工程设计中最常遇到的问题了。一般说来,导致建立时间违例主要有两个原因:逻辑级数太大或者扇出太大,当然也可以尝试通过降频来解决建立时间违约。 1.1 逻辑级数太高 Levels指的是逻辑级数logic level,一个logic level的延迟对应的是一个LUT和一个Net的延迟,对于不同的器件,不同频率的设计能

mu_guang_的博客 7155

【STM32单片机】RS485通信—基于STM32G474芯片

做项目需要用485通信来控制Go电机参考资料:【【STM32F103C8T6系列】10. 实验例程——485(USART串口)通讯实验】 https://www.bilibili.com/video/BV19w411r7ka/?PDF: STM32G474 开发指南 正点原子 DMG474 开发板教程 第28章485只是物理层,代码逻辑还是UART串口通信,相当于是电路有RS485转换芯片,所以还是用UART串口通信方式。

m0_48808835的博客 3647

C++中char与unsigned char比较及使用注意事项

char与unsigned char 比较以及使用注意事项

weixin_45914251的博客 3280

深入解析Linux Suspend/Resume机制——从用户态到内核态的完整流程

本文深入解析Linux Suspend/Resume机制,从用户态触发到内核态执行的完整流程。详细介绍了三种挂起模式(Freeze、Standby、Suspend to RAM)的实现原理,包括系统调用入口、状态验证、设备挂起流程及平台相关操作。同时提供实战调试技巧,帮助开发者解决电源管理中的常见问题。

weixin_29313239的博客 444

c语言随机生成字符串_C语言快速入门——字符串生成

假设我们现在正在开发一款文档管理类软件。其中一项功能就是一次性创建多个名称连续的文件夹,如Icon1、 Icon2等等。整个名称可以分作两部分,前半部分是常量字符串"Icon",后半部分是编号字符串。在使用循环语句生成名称时,编号是数字,如果能将编号转换为一个字符串,那么我们就可以用strcat函数将两部分组合起来,然后使用mkdir创建文件夹即可。因此,现阶段问题就变成了如何把数字转换为对应的字...

weixin_39609887的博客 2567

【黑马点评】项目知识点及面经整理

【黑马点评】项目知识点及面经整理

m0_52031708的博客 6604

GNN-图卷积模型-直推式-2016:GCN【消息传递(前向传播):聚合函数+更新函数】【聚合函数:mean(邻域所有节点取平均值)】【训练更新函数的参数】【空域+频域】【同质图】

图神经网络(GNN):GCN【开山之作】

u013250861的博客 2055

C/C++程序中数字int、字符串string、char*之间的转换方法汇总

在写跨平台C/C++程序时,可能会用到数字int、字符串string、char*之间的转换,下面是一些方法的汇总: int atoi (const char * str);//字符串转int long int atol ( const char * str );//字符串转long double atof (const char* str);//字符串转double char *itoa(i...

HuYingJie_1995的博客 1426

在MATLAB中将C语言代码转化为可执行的mexw64文件

这样,您可以将高效的C语言算法集成到MATLAB环境中,以便更好地利用MATLAB的功能和特性。请记住,在使用mex转换C语言代码之前,您需要正确编写和测试C语言代码,并确保它与MATLAB的mex接口兼容。MATLAB是一种功能强大的数值计算软件,它提供了一个机制,可以将C语言代码转化为MATLAB可执行的mexw64文件。在上述命令中,"-output"选项指定生成的mex文件的名称,"myfunction"是您选择的名称,"myfunction.c"是要编译的C语言源文件。步骤1:编写C语言代码。

CodeRoarX的博客 1427

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

为什么80%的码农都做不了架构师?>>> ...

weixin_34342578的博客 1437

ESP32 智能垃圾分类助手:从硬件搭建到代码实现的硬核指南

基于 ESP32 的智能垃圾分类设备,充分利用了 ESP32 的外设兼容性和处理能力,通过简单的模块组合和代码编写,就能实现垃圾分类的智能化。无论是作为学生的物联网课程设计,还是家庭的环保小工具,这个项目都兼具实用性和趣味性。如果你想进一步优化功能,还可以尝试加入更多传感器(如红外传感器检测垃圾满溢),让设备更加智能。

weixin_42300449的博客 928

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

使用string和string_view(二)——数值转换、std::string_view和非标准字符串

数值转换、std::string_view和非标准字符串

qq_51180928的博客 1685

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【C语言】 字符函数与字符串函数 和 <string.h>

string.h 的库函数里面有strcpy、strcat、strcmp、strncpy、strncat、strncmp、strstr、strtok、strerror、memcmp等等的函数,那我们来一 一介绍。strlen 是用来计算字符串的首地址到达‘\0’位置之间又多少个字符的函数准确来说strlen 不是string.h 函数里面的没有string.h 的库函数也可以使用。放回类型:size_t (非负数的整形类型)传参: char* (字符指针)

youren_7715的博客 398

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ios十进制、十六进制字符串,byte,data等之间的转换

十进制->十六进制 Byte bytes[]={0xA6,0x27,0x0A}; NSString *strIdL  = [NSString stringWithFormat:@"%@",[[NSString alloc] initWithFormat:@"%02lx",(long)bytes[0]]]; 十六进制->十进制 NSString *rechar

zwl492454828的专栏 2万+

C++,CString,string,char*,int等转换

环境是VS2010: string 转 CString CString.Format(_T(”%s”), string.c_str()); int 转CString int i = 15; CString str; str.Format(_T("%d"), i); 其他环境: CString 转char * CString cstr; char *p

BrandoLv 1323

visual studio中如何将string类型值转为BYTE(unsigned char)类型

昨天困惑一件事,就是手里有个string类型的字符串,像01 23 45 67 89 AB CD EF,根据空格拆分为一个个的子字符串后(如EF),需要放到一个BYTE(typedef unsigned char)类型数组中,该怎么放呢? 首先BYTE是个什么类型? BYTE即unsigned char,说白了就是0-255的数字。visual studio里为什么专门定义了一个BYTE呢? ...

weixin_30484247的博客 664

c++入门基础(基础语法)

一个变量相当于输出一个点,一个循环相当于输出一条线,双重循环相当于输出一个平面,三重循环相当于输出一个立体图形。总结:与if语句比,对于多条件判断时,switch的结构清晰,执行效率高,缺点是switch不可以判断区间。表达式3){ // 表达式2为真继续循环,否则结束循环。4 变量有特定的类型,类型决定了存储单元的大小和变量值的范围,运算符可应用于变量上。while( 循环条件 ){ // 条件为真继续循环,否则结束循环。

weixin_46836127的博客 3万+

C语言进制转换:从原理到实践,实现字符串与整数的互转

进制转换是计算机科学和编程中的基础概念,它描述了数值在不同基数(如二进制、八进制、十进制、十六进制)下的表示方法。其核心原理基于除基取余法和乘基累加法,分别用于将整数转换为字符串表示,以及将字符串解析为整数值。掌握这一原理对于理解计算机底层数据存储、进行网络协议解析、内存调试以及嵌入式系统开发至关重要。在实际工程中,开发者常需处理来自网络数据包、配置文件或用户输入的字符串形式数据,并将其转换为程序可运算的整数,反之亦然。本文聚焦于C语言环境,通过实现健壮的转换函数,深入探讨了如何处理负数、溢出、缓冲区安全以

weixin_30425949的博客 329

STC89C52 驱动 LCD1602 实战:5类数据(字符/十进制/十六进制/二进制/自定义)显示函数库

本文详细介绍了STC89C52单片机驱动LCD1602显示屏的实战方法,提供了5类数据(字符、十进制、十六进制、二进制和自定义字符)的显示函数库。通过基础配置、初始化流程、数字显示实现和自定义字符功能,帮助开发者快速掌握LCD1602的驱动技术,适用于各种嵌入式显示项目。

weixin_34348805的博客 566

C++数字与字符串转换全指南:从atoi到from_chars选型与性能优化

在C++开发中,数字与字符串转换是基础且高频的操作,涉及错误处理、性能、可移植性和精度等核心问题。传统C风格函数如atoi和itoa存在非标准、错误静默等缺陷,而C++11引入的std::to_string和std::stoi系列提供了更安全的异常处理,C++17的std::from_chars和std::to_chars则实现了无异常、无内存分配的高性能转换。理解这些方法的原理与差异,能帮助开发者在配置解析、日志输出、协议处理等场景中做出合理选型,避免精度丢失和跨平台问题,提升代码的健壮性与执行效率。

weixin_33968104的博客 407

C语言实现任意进制转换:从原理到健壮工具库的完整指南

进制转换是计算机科学中数据表示与处理的基础,其核心原理在于不同位置记数法之间的数值等价变换。理解并实现任意进制(如二进制、八进制、十六进制)间的相互转换,对于网络协议解析、嵌入式系统调试和文件格式处理等底层开发至关重要。一个健壮的转换工具需要正确处理字符映射、大数溢出和非法输入等边界情况,确保代码的可靠性和复用性。本文通过构建一个模块化的C语言工具集,深入探讨了从数学原理到工程实践的完整实现路径,并重点解决了逆向转换和错误处理等常见痛点,为开发者提供了即拿即用的解决方案。

weixin_30945039的博客 1777
上一篇: 配置OpenCV产生flann\logger.h(66): error C4996: ‘fopen': This function or variable may be unsafe问题
下一篇: Excel.Application使用手册
harryptter
博客等级 码龄18年 370粉丝 184原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值