在Crypto ++中将十六进制字符串转换为字节

时间:2013-07-23 16:52:33

标签: c++ encoding cryptography crypto++

我有十六进制字符串,我需要转换为const byte*。我正在使用Crypto ++进行散列,它需要密钥在const byte*我有什么办法可以使用任何Crypto ++库将十六进制字符串转换为const byte*,或者我必须要出现我自己的?

3 个答案:

答案 0 :(得分:5)

Crypto ++中有一个HexDecoder类。

您需要提供此字符。似乎Crypto ++没有直接区分字符和字节。因此,varren提供的以下代码行将起作用:

StringSource ss(source, true, new HexEncoder(new StringSink(destination)));
const byte* result = (const byte*) destination.data();

答案 1 :(得分:1)

  

我有十六进制字符串,我需要转换为const字节*
  ...
  但它会在字符串中。我需要它在byte *

您应该使用HexDecoderArraySink。类似的东西:

string encoded = "FFEEDDCCBBAA99887766554433221100";
ASSERT(encoded.length() % 2 == 0);

size_t length = encoded.length() / 2;
unique_ptr<byte[]> decoded(new byte[length]);

StringSource ss(encoded, true /*pumpAll*/, new ArraySink(decoded.get(), length));

然后,您可以将字节数组decoded.get()用作byte*

您还可以使用vector<byte>。在这种情况下,byte*&v[0]。类似的东西:

string encoded = "FFEEDDCCBBAA99887766554433221100";
ASSERT(encoded.length() % 2 == 0);

size_t length = encoded.length() / 2;
vector<byte> decoded;
decoded.resize(length);

StringSource ss(encoded, true /*pumpAll*/, new ArraySink(&decoded[0], length));
  

(评论)但它会在字符串中。我需要它在byte *

这更容易:

string encoded = "FFEEDDCCBBAA99887766554433221100";
string decoded;

StringSource ss(encoded, true /*pumpAll*/, new StringSink(decoded));
const byte* data = reinterpret_cast<const byte*>(decoded.data());

如果你想要非const版本,那么使用:

byte* ptr = reinterpret_cast<byte*>(&decoded[0]);

答案 2 :(得分:0)

// HEX to BIN using CryptoPP
string encoded = "FFEEDDCCBBAA99887766554433221100";
size_t length = encoded.length() / 2;
vector<byte> decoded;
decoded.resize(length);
StringSource ss(encoded, true, new HexDecoder(new ArraySink(&decoded[0], length)));