我正在实现一个使用libcrafter和crypto++在网络上传输特定帧的系统。但我遇到的问题根本就不在这个层次上。
它是关于在这些库中使用的类型之间的转换。
1)在排放(已解决)
我正在尝试将Crafter::byte array转换为std::string,以便将此消息放入网络帧(作为AES加密/解密的初始化向量)。
此外,必须对iv进行零化,而且我无法正确地初始化它(不管答案是这里还是那里)。
编辑:要将其初始化为00,我必须在十六进制:0x30中执行。为了将其转换为std::string,我必须提供长度(即ivLen2 )(谢谢您的回答)。
我要做的是:
const int ivLen2 = 2;
std::string encrypted_message("whatever");
Crafter::byte iv[ivLen2]={0x30, 0x30}; // crypto salt of 2 bytes at 0.
std::string ivStr( reinterpret_cast< char const* >(iv), ivLen2 ) ;
string mess2send = ivStr + encrypted_message;如果我展示它们,用这个:
cout<<"iv[0] : "<<iv[0]<<endl; // display 0
cout<<"mess2send : "<<mess2send<<endl; // display 00whatever为什么我不简单地创建一个零字符串并发送呢?为了有通用函数和可重用的代码。
2)在接待处(待定)
没有意外,我不得不做相反的事情。我得到一个iv和message连接在一个vector<byte>* payload中,我必须将这个iv提取为一个byte array,并将message提取到一个字符串中。
message并不是真正的问题,因为std::string已经接近vector了。
下面是我尝试检索iv的方法:
Crafter::byte iv[ ivLen2 ];
for (int i = 0; i < ivLen2; i++)
{
iv[i] = (byte)payload->at(i);
}
std::string iv_rcv( reinterpret_cast< char const* >(iv) ) ;为了显示它们,我做了(在同一个循环中):
cout<<iv[i];但它给了我一个非ASCII的角色。
Crafter::byte* iv;
std::string iv_rcv( payload->begin(), payload->begin()+ivLen2 ) ;
iv = (byte*)iv_rcv.c_str();但它并没有给我假定的初始化值..。
有人有线索吗?我的代码错了吗?
发布于 2015-09-18 14:11:42
我认为这行不通:
const int ivLen2 = 2;
std::string encrypted_message("whatever");
Crafter::byte iv[ivLen2]={0x00, 0x00}; // crypto salt of 2 bytes
std::string ivStr( reinterpret_cast< char const* >(iv) ) ;std::string如何知道要从iv指针复制多少数据?
您必须使用一个构造函数来获取数据的长度,如下所示:
std::string ivStr( reinterpret_cast< char const* >(iv), ivLen2 ) ;指针仅构造函数用于以空字符结尾的特定编码字符串。除非你使用的是其中之一,否则你必须通过长度。
试试这个:
const int ivLen2 = 2;
std::string encrypted_message("whatever");
Crafter::byte iv[ivLen2]={0x00, 0x00}; // crypto salt of 2 bytes
std::string ivStr( reinterpret_cast< char const* >(iv), ivLen2 ) ;
std::string mess2send = ivStr + encrypted_message;
std::cout << (int)mess2send[0] << (int)mess2send[1] << mess2send.substr(2) << '\n';https://stackoverflow.com/questions/32653999
复制相似问题