vc++ 字符串和HEX字符串转换【有一些c++的知识点】
一、字符串和HEX字符串转换
1.字符串-->HEX字符串
使用了string和char*两种方法。
void XORStr_Encrypt(const char keys[], char* text) { static const char* const lut = "0123456789ABCDEF"; size_t len = strlen(text); // 1.string会自动初始化output string output; output.reserve(2 * len); //// 2. //char* output = new char[len * 2]; //size_t j = 0; for (size_t i = 0; i < len; i++) { const unsigned char c = text[i] ^ keys[i % 8]; //>> is DEC-->bit-->left or right !!! // 1. output.push_back(lut[c >> 4]); output.push_back(lut[c & 0x0F]); //// 2. //output[j++] = lut[c >> 4]; //output[j++] = lut[c & 0x0F]; } // 1.
//使用了 strcpy的时候需要 #pragma warning( disable : 4996),否则会报错!
//c_str() 返回的指针保证指向一个size()+1长的空间,而且最后一个字符肯定'\0'。
//而data() 返回的指针则保证指向一个size()长度的空间,有没有null-terminate不保证,可能有,可能没有,看库的实现了。
//c_str()返回的是C风格的字符串的首地址,而data()返回的是字符数组的首地址。
strcpy(text, output.data());
//// 2.
//output[j] = '\0';
//strcpy(text, output); ////必须使用delete[]释放内存,但在此处会引发错误 //delete[] output; }
2.HEX字符串-->字符串
void XORStr_Decrypt(const char keys[], char* text) { static const char* const lut = "0123456789ABCDEF"; // size_t len = strlen(text); //string会自动初始化output string output; if (len > 2) { size_t j = 0; output.reserve(len / 2); for (size_t i = 0; i < len; i += 2) { const unsigned char a = text[i]; //find =a first value:[lut, lut + 16] const char* p = std::lower_bound(lut, lut + 16, a); if (*p != a) throw std::invalid_argument("not a hex digit"); const unsigned char b = text[i + 1]; //find =b first value:[lut, lut + 16] const char* q = std::lower_bound(lut, lut + 16, b); if (*q != b) throw std::invalid_argument("not a hex digit"); //=0,1,2,3...10,11,12,13,14,15 output.push_back(((p - lut) << 4) | (q - lut)); // output[j] = output[j] ^ keys[j % 8]; j++; }
//使用了 strcpy的时候需要 #pragma warning( disable : 4996),否则会报错!
//c_str()返回的指针保证指向一个size()+1长的空间,而且最后一个字符肯定'\0'。
//而data()返回的指针则保证指向一个size()长度的空间,有没有null-terminate不保证,可能有,可能没有,看库的实现了。
//c_str()返回的是C风格的字符串的首地址,而data()返回的是字符数组的首地址。
strcpy(text, output.c_str());
}
}
二、知识扩展【引用别人的】
A. C++ 中 string和char* 的区别:
1、定义:
string:string是STL当中的一个容器,对其进行了封装,所以操作起来非常方便。
char*:char *是一个指针,可以指向一个字符串数组,至于这个数组可以在栈上分配,也可以在堆上分配,堆得话就要你手动释放了。
2、区别:
string的内存管理是由系统处理,除非系统内存池用完,不然不会出现这种内存问题。
char *的内存管理由用户自己处理,很容易出现内存不足的问题。
当我们要存一个串,但是不知道其他需要多少内存时, 用string来处理就最好不过了。
当你知道了存储的内存的时候,可以用char *,但是不如用string的好,用指针总会有隐患。
用string还可以使用各种成员函数来处理串的每一个字符,方便处理。
用char *处理串,就不如string的方便了,没有相应的函数来直接调用,而是要自己编写函数来完成串的处理,而且处理过程中用指针还很容易出现内存问题。
char *s="string"的内容是不可以改的;char s[10]="string"的内容是可以改的
3、注意:
当我们定义了一个string,就不能用scanf("%s",s)和printf("%s",s)输入输出。主要是因为%s要求后面是对象的首地址
4、转化:
当 string 直接转化成 const char *时,可以通过两个函数c_str(),data() 成员函数,例如:
这里需要注意:
c_str()返回的指针保证指向一个size()+1长的空间,而且最后一个字符肯定'\0'。
而data返回的指针则保证指向一个size()长度的空间,有没有null-terminate不保证,可能有,可能没有,看库的实现了。
c_str()返回的是C风格的字符串的首地址,而data()返回的是字符数组的首地址。
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
string s="xiaoming";
const char *a=s.c_str();//去掉const会显示编译错误
const char *b=s.data();
printf("a:[%s],b:[%s]\n",a,b);
}
如果直接转化成char*也可以。但是我觉得这个还是挺麻烦的。
将char *转化成string,直接转化就可以。就是注意输出的问题:
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
char *a="xiaoming";
string s;
s=a;
printf("%s\n",s.c_str());
}
B. C++ new和delete(C++动态分配和释放内存)
new 和delete的两种方式:
1.
int* p = new int; *p = 5; delete p; delete p; //再次delete会导致程序出错
2.
int* p = new int[20]; p[0] = 1; delete[] p;
要注意用delete p和delete[] p的方式释放的区别!
浙公网安备 33010602011771号