c++ - 将字符转换为 ASCII 返回的数字太大

标签 c++ ascii xor c-strings stringstream

所以我有这个函数可以对字符串进行异或运算,然后将其转换为如下格式:

\x55\x1\x53\x21...

但问题是该函数首先返回负值,但我通过将它从 CHAR 转换为 UCHAR 来解决这个问题,但现在它开始给我提供太大的值,编译器不允许我编译,因为它的。为什么会发生这种情况的任何想法?在网上找不到任何相关信息。

__inline char* EncryptString(const char* String, const char* Key)
{
    char* szEncrypted = new char[lstrlenA(String) + 1];
    memcpy(szEncrypted, String, lstrlenA(String) + 1);

    for (int32_t i = 0; i < lstrlenA(String); ++i)
        szEncrypted[i] = String[i] ^ Key[i % (lstrlenA(Key))];

    std::stringstream lpStream;

    for (int32_t i = 0; i < lstrlenA(szEncrypted); ++i)
    {
        char cCharInd       = szEncrypted[i];
        UINT nCharNum       = UINT(cCharInd);

        lpStream << "\\x" << std::hex << nCharNum;
    }

    std::string sHexEscaped = lpStream.str();
    lpStream.clear();

    delete[] szEncrypted;

    char* szReturn = new char[sHexEscaped.length() + 1];
    memcpy(szReturn, sHexEscaped.c_str(), sHexEscaped.length() + 1);

    return szReturn;
}

最佳答案

问题是 char 类型可以是有符号的或无符号的(取决于编译器)。我认为以下代码可以帮助您:

const unsigned char uc = static_cast<unsigned char>( szEncrypted[i] );
const unsigned int code = uc;
lpStream << "\\x" << std::hex << code;

附言看起来您实际上不需要使用临时缓冲区 szEncrypted。

更新:

我试图在下面的代码中演示这种加密是如何工作的(源文件编码是 Windows-1251)。您还必须知道加密字符串可能包含 \0 字节,因此,要计算加密字符串的长度,您可能会使用如下内容:const char rawString[] = "\xf\x55\x0\x1e\x22\x98\x20\x1e\x2b\x4b\x12"; const int rawSize = sizeof( raw ) - 1;

#include <string>
#include <sstream>
#include <iostream>

using namespace std;

string EncryptString( const char* String, const char* Key )
{
    std::stringstream lpStream;
    const int keyLength = strlen( Key );
    for( int i = 0; String[i] != '\0'; i++ ) {
        char ec = String[i] ^ Key[i % keyLength];
        unsigned char uc = static_cast<unsigned char>( ec );
        lpStream << "\\x" << std::hex << static_cast<unsigned int>( uc );
    }
    return lpStream.str();
}

void DecryptString( string& String, const char* Key )
{
    const int keyLength = strlen( Key );
    for( string::size_type i = 0; i < String.length(); i++ ) {
        String[i] ^= Key[i % keyLength];
    }
}

int main()
{
    system( "ChCp 1251" );
    const char* key = "Пётр";
    cout << EncryptString( "Антон Тодуа", key ) << endl;
    const char raw[] = "\xf\x55\x0\x1e\x22\x98\x20\x1e\x2b\x4b\x12";
    string data( raw, sizeof( raw ) - 1 );
    DecryptString( data, key );
    cout << data << endl;
    return 0;
}

关于c++ - 将字符转换为 ASCII 返回的数字太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49591723/

相关文章:

c++ - Typedef 在 CRTP 中创建一个(假的)派生类 - 不可能吗?

c++ - ANTLR4 cpp 语法无法生成解析器;空指针异常

c - 为什么 C 语言的控制台图形这么慢?

PHP 格雷码 - 异或错误

c++ - 如何在 OpenCV 中将点传递给 cvFitEllipse2

c++ - 用于 Sutter 的无锁队列的 Boost 库或 C++0x 原子的等效实现?

c - 移位扩展 ASCII 码

java - 在 Java 中将二进制数据编码为 ASCII

Java XOR 运算符问题

c - C/C++ 中的简单 XOR 加密例程