3

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

4

3 回答 3

6

Crypto++ 中有一个HexDecoder类。

你需要喂这个角色。看来 Crypto++ 并没有直接区分字符和字节。因此 varren 提供的以下代码行将起作用:

string destination;
StringSource ss(source, true, new HexDecoder(new StringSink(destination)));    
const byte* result = (const byte*) destination.data();
于 2013-07-23T18:44:48.910 回答
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));

(评论)但它将是字符串。我需要它以字节为单位*

这更容易:

string encoded = "FFEEDDCCBBAA99887766554433221100";
string decoded;

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

如果您想要非常量版本,请使用:

byte* ptr = reinterpret_cast<byte*>(&decoded[0]);
于 2015-05-02T21:55:04.337 回答
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)));
于 2020-12-05T10:49:19.743 回答