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的方式释放的区别!

 

posted on 2025-04-14 17:14  =WinHZ  阅读(143)  评论(0)    收藏  举报

导航