我正在使用旧程序并需要帮助交换Hex字符串的顺序。
是的,一个字符串......如:
string hexString = "F07D0079"
string hexString2= "F07F"
我需要每个字符串看起来像: 79007DF0& 分别为7FF0。
对于上帝的爱,我不知道为什么他们被存储在字符串中,但他们是 这是一个小端/大端的问题,但由于它在一个字符串中,我不能使用标准函数来反转顺序吗?
有没有简单的方法可以做到这一点?
std::string swapValues(string originalHex)
{
string swappedHex;
//what to do here.
return swappedHex;
}
答案 0 :(得分:4)
首先检查长度是否均匀(如果尚未消毒):
assert(hex.length() % 2 == 0);
然后反转字符串:
std::reverse(hex.begin(), hex.end());
现在字节的顺序正确,但每个字节中的数字都是错误的,所以我们需要将它们交换回来:
for (auto it = hex.begin(); it != hex.end(); it += 2) {
std::swap(it[0], it[1]);
}
答案 1 :(得分:2)
我可能会使用append
成员函数。
std::string reverse_pairs(std::string const & src)
{
assert(src.size() % 2 == 0);
std::string result;
result.reserve(src.size());
for (std::size_t i = src.size(); i != 0; i -= 2)
{
result.append(src, i - 2, 2);
}
return result;
}
(作为可扩展性练习,您也可以将“2
”作为参数。)
如果您想就地执行此操作,可以在循环中使用std::rotate
。
答案 2 :(得分:1)
我不会为这件事过于聪明而烦恼:
std::string swapValues(const std::string& o)
{
std::string s(o.length());
if (s.length() == 4) {
s[0] = o[2];
s[1] = o[3];
s[2] = o[0];
s[3] = o[1];
return s;
}
if (s.length() == 8) {
// left as an exercise
}
throw std::logic_error("You got to be kidding me...");
}
答案 3 :(得分:0)
应该有库函数可用(天真的字符串操作可能不好):
#include <iostream>
#include <arpa/inet.h>
int main() {
std::string hex32 = "F07D0079";
std::string hex16 = "F07F";
std::uint32_t u32 = std::strtoul(hex32.c_str(), 0, 16);
std::uint16_t u16 = std::strtoul(hex16.c_str(), 0, 16);
// Here we would need to know the endian of the sources.
u32 = ntohl(u32);
u16 = ntohs(u16);
std::cout << std::hex << u32 << ", " << u16 << '\n';
}
Linux / Little Endian
对字符串进行操作的任何函数都必须知道目标平台(因此没有通用的解决方案)