我必须将128位的CRYPTO ++ AES密文转换为pribtable数字字符串。
我目前正在使用以下代码进行投射,但bitset
对我的情况来说太慢了。有谁知道这样做的有效方法?
string output = "";
for (std::size_t i = 0; i < 16; ++ i) {
output += bitset<8>(ciphertext[i]).to_string();
}
如何将二进制字节转换为可打印的数值?非常感谢!
答案 0 :(得分:2)
有很多聪明的方法可以从一个数字计算二进制字符串,但这并不重要;无论使用何种方法,您都可以使用该方法填充一次表格:
std::string bytes[256];
for (unsigned char c = 0; c<=255; ++c) {
bytes[c] = bitset<8>(c).to_string();
}
然后bytes[c]
将为您提供特定字节的字符串。
在你的帖子中显示四行代码。以下是使用上述预先计算的字符串将这四行代码更改为:
string output = "";
for (std::size_t i = 0; i < 16; ++ i) {
output += bytes[ciphertext[i]];
}
此外,您的代码可能涉及循环期间的一些分配。避免这些的最佳方法完全取决于您如何使用output
字符串,但至少output.reserve(16*8)
不会受到伤害。
答案 1 :(得分:0)
我愿意
char ct_b[16];
char ct_h[33]; // 2 hex digits per byte + NUL
snprintf(ct_h, 33,
"%02x%02x%02x%02x%02x%02x%02x%02x"
"%02x%02x%02x%02x%02x%02x%02x%02x",
ct_h[ 0], ct_h[ 1], ct_h[ 2], ct_h[ 3],
ct_h[ 4], ct_h[ 5], ct_h[ 6], ct_h[ 7],
ct_h[ 8], ct_h[ 9], ct_h[10], ct_h[11],
ct_h[12], ct_h[13], ct_h[14], ct_h[15]);
这肯定会比你拥有的更快,但代价是更多的重复。它确实产生十六进制而不是二进制,但十六进制很可能是你真正想要的。
(如果您之前没有看到字符串常量连接:字符串常量的前半部分之后没有逗号是有意的。)
(请告诉我你没有使用ECB。)
答案 2 :(得分:0)
string output = "";
for (std::size_t i = 0; i < 16; ++ i) {
output += bitset<8>(ciphertext[i]).to_string();
}
如果您对此感兴趣,还有Crypto ++源/汇方法:
string output;
ArraySource as(ciphertext, sizeof(ciphertext),
true /*pump*/,
new HexEncoder(
new StringSink(output)
) // HexEncoder
); // ArraySource