字符串< - > byte []转换

时间:2015-09-18 14:02:56

标签: c++ arrays string byte libcrafter

我实施的系统使用libcraftercrypto++来传输网络上的特定帧。但我遇到的问题根本就不在这个层面。

关于这些库中使用的类型之间的转换。

1)发射(已解决)

我尝试将Crafter::byte array转换为std::string,以便将此消息放入网络框架中(作为AES的初始化向量)加密/解密)。

此外,iv必须归零,我无法正确初始化(尽管答案为herethere)。

编辑:要将其初始化为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)在接待处(待定)

没有惊喜我必须做相反的事情。我得到一个ivmessagevector<byte>* payload内连接,我必须将iv提取为byte array,并将message提取到字符串中。

鉴于message接近std::stringvector实际上并不是问题。

以下是我试图检索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字符。

我也尝试了此操作(thisthis后的答案):

Crafter::byte* iv;

std::string iv_rcv( payload->begin(), payload->begin()+ivLen2 ) ;
iv = (byte*)iv_rcv.c_str();

但它并没有给我假定的初始化值......

有人有线索吗?我的代码错了吗?

1 个答案:

答案 0 :(得分:1)

我认为这不会起作用:

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指针复制多少数据?

你必须使用一个构造函数来获取数据的 length ,如:

std::string ivStr( reinterpret_cast< char const* >(iv), ivLen2 ) ;

指针构造函数用于由 null字符终止的特定编码字符串。除非你使用其中一个,否则你必须通过这个长度。

试试这个:

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';