C++ C++;达到空字节时XOR失败?

C++ C++;达到空字节时XOR失败?,c++,encryption,byte,xor,C++,Encryption,Byte,Xor,以下是我现在掌握的代码: #include <iostream> #include <string> #include <sstream> std::string string_to_hex(const std::string& input) { static const char* const lut = "0123456789ABCDEF"; size_t len = input.length(); std::strin

以下是我现在掌握的代码:

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

std::string string_to_hex(const std::string& input)
{
    static const char* const lut = "0123456789ABCDEF";
    size_t len = input.length();

    std::string output;
    output.reserve(2 * len);
    for (size_t i = 0; i < len; ++i)
    {
        const unsigned char c = input[i];
        output.push_back(lut[c >> 4]);
        output.push_back(lut[c & 15]);
    }
    return output;
}

std::string encrypt(std::string msg, std::string key)
{
    // Make sure the key is at least as long as the message
    std::string tmp(key);
    while (key.size() < msg.size())
        key += tmp;

    // And now for the encryption part
    for (std::string::size_type i = 0; i < msg.size(); ++i)
        msg[i] ^= key[i];
    return msg;
}
std::string decrypt(std::string msg, std::string key)
{
    return encrypt(msg, key); // lol
}

int main()
{
    std::cout << string_to_hex(encrypt("Hello World!", "monkey")) << std::endl;
    std::cout << decrypt("\x25\x0A\x02\x07\x0A\x59\x3A\x00\x1C\x07\x01\x58", "monkey") << std::endl;
    std::cout << string_to_hex(encrypt("Hello. This is a test of encrypting strings in C++.", "monkey")) << std::endl;
    std::cout << decrypt("\x25\x0A\x02\x07\x0A\x57\x4D\x3B\x06\x02\x16\x59\x04\x1C\x4E\x0A\x45\x0D\x08\x1C\x1A\x4B\x0A\x1F\x4D\x0A\x00\x08\x17\x00\x1D\x1B\x07\x05\x02\x59\x1E\x1B\x1C\x02\x0B\x1E\x1E\x4F\x07\x05\x45\x3A\x46\x44\x40", "monkey") << std::endl;

}
当到达\x00时,解密似乎停止。有人对如何解决这个问题有什么想法吗


谢谢

接受char*的std::string构造函数假定输入是以null结尾的字符串,因此即使字符串文本中有大量数据超过了null字节,当您将其传递到函数中时,std::string构造函数将在到达该null字节时停止读取

你有几个选择来解决这个问题。作为一个选项,std::string类型有一个双参数构造函数,您可以在其中提供指向字符串中第一个元素的指针和字符串结束字节的指针。然后,字符串将自身初始化为该范围内的文本,忽略中间空终止符

char s1[] = "\x25\x0A\x02\x07\x0A\x59\x3A\x00\x1C\x07\x01\x58";
char s2[] = "\x25\x0A\x02\x07\x0A\x57\x4D\x3B\x06\x02\x16\x59\x04\x1C\x4E\x0A\x45\x0D\x08\x1C\x1A\x4B\x0A\x1F\x4D\x0A\x00\x08\x17\x00\x1D\x1B\x07\x05\x02\x59\x1E\x1B\x1C\x02\x0B\x1E\x1E\x4F\x07\x05\x45\x3A\x46\x44\x40";
std::cout << string_to_hex(encrypt("Hello World!", "monkey")) << std::endl;
std::cout << decrypt(std::string(std::begin(s1), std::end(s1)-1), "monkey") << std::endl;
std::cout << string_to_hex(encrypt("Hello. This is a test of encrypting strings in C++.", "monkey")) << std::endl;
std::cout << decrypt(std::string(std::begin(s2), std::end(s2)-1), "monkey") << std::endl;
chars1[]=“\x25\x0A\x02\x07\x0A\x59\x3A\x00\x1C\x07\x01\x58”;
字符s2[]=“x25\x0A\x02\x07\x0A\x57\x4D\x3B\x06\x02\x16\x59\x04\x1C\x4E\x0A\x45\x0D\x08\x1C\x1A\x4B\x0A\x1F\x4D\x0A\x00\x08\x17\x00\x1D\x1B\x07\x05\x02\X09\x1E\x1B\x1B\x1C\x02\x1E\x1E\x40\x40\x40\x40\x40\x40”;

std::cout请不要将pastebin用于代码。粘贴到问题中,选择,然后单击
[{}]
进行格式化。当您在调试器中单步执行此代码时发生了什么?问题到底出在哪里?啊,我明白了。这比手动将每行缩进4个空格要容易得多。谢谢不太清楚。当执行类似于
解密(encrypt(“Hello World!”,“monkey”),“monkey”)
的操作时,它工作得很好,但当我尝试通过十六进制数据时,它却没有工作。我想说,是std:string构造函数终止于空字节数据,并假设这是C样式常量stringworld的结尾,这似乎正是我要找的!非常感谢。
char s1[] = "\x25\x0A\x02\x07\x0A\x59\x3A\x00\x1C\x07\x01\x58";
char s2[] = "\x25\x0A\x02\x07\x0A\x57\x4D\x3B\x06\x02\x16\x59\x04\x1C\x4E\x0A\x45\x0D\x08\x1C\x1A\x4B\x0A\x1F\x4D\x0A\x00\x08\x17\x00\x1D\x1B\x07\x05\x02\x59\x1E\x1B\x1C\x02\x0B\x1E\x1E\x4F\x07\x05\x45\x3A\x46\x44\x40";
std::cout << string_to_hex(encrypt("Hello World!", "monkey")) << std::endl;
std::cout << decrypt(std::string(std::begin(s1), std::end(s1)-1), "monkey") << std::endl;
std::cout << string_to_hex(encrypt("Hello. This is a test of encrypting strings in C++.", "monkey")) << std::endl;
std::cout << decrypt(std::string(std::begin(s2), std::end(s2)-1), "monkey") << std::endl;