将二进制字符串更改为十六进制时,我只能根据我找到的答案将其设置为一定的大小。但是我想以比这更有效的方式将 MASSIVE Binary 字符串更改为完整的十六进制字符串,这是我遇到的唯一完全做到这一点的方法:
for(size_t i = 0; i < (binarySubVec.size() - 1); i++){
string binToHex, tmp = "0000";
for (size_t j = 0; j < binaryVecStr[i].size(); j += 4){
tmp = binaryVecStr[i].substr(j, 4);
if (!tmp.compare("0000")) binToHex += "0";
else if (!tmp.compare("0001")) binToHex += "1";
else if (!tmp.compare("0010")) binToHex += "2";
else if (!tmp.compare("0011")) binToHex += "3";
else if (!tmp.compare("0100")) binToHex += "4";
else if (!tmp.compare("0101")) binToHex += "5";
else if (!tmp.compare("0110")) binToHex += "6";
else if (!tmp.compare("0111")) binToHex += "7";
else if (!tmp.compare("1000")) binToHex += "8";
else if (!tmp.compare("1001")) binToHex += "9";
else if (!tmp.compare("1010")) binToHex += "A";
else if (!tmp.compare("1011")) binToHex += "B";
else if (!tmp.compare("1100")) binToHex += "C";
else if (!tmp.compare("1101")) binToHex += "D";
else if (!tmp.compare("1110")) binToHex += "E";
else if (!tmp.compare("1111")) binToHex += "F";
else continue;
}
hexOStr << binToHex;
hexOStr << " ";
}
它彻底而绝对,但速度很慢。
有没有更简单的方法来做到这一点?
原文由 fakeaccount 发布,翻译遵循 CC BY-SA 4.0 许可协议
更新 最后添加了比较和基准
这是基于完美哈希的另一种方法。完美的哈希是使用
gperf
生成的(如下所述: Is it possible to map string to int faster than using hashmap? )。我通过将函数局部静态数据移开并将 ---
hexdigit()
和hash()
标记为constexpr
来进一步优化。这消除了不必要的任何初始化开销,并为编译器提供了充分的优化空间/我不认为事情会变得比这快得多。
如果可能,您 可以 尝试一次读取例如 1024 个半字节,并让编译器有机会使用 AVX/SSE 指令集对操作进行矢量化。 (我没有检查生成的代码是否会发生这种情况。)
在流模式下将
std::cin
转换为std::cout
的完整示例代码是:这是
Perfect_Hash
类,使用hexchar
查找略有编辑和扩展。请注意,它确实验证了 --- 使用assert
DEBUG
构建的输入:住在科利鲁
例如
od -A none -t o /dev/urandom | tr -cd '01' | dd bs=1 count=4096 | ./test
基准
我想出了三种不同的方法:
为了做一些比较,我已经
-O3 -march=native -g0 -DNDEBUG
)编译它们结果如下:
naive
方法做得相当好