在c ++中合并十六进制字符串的最佳方法? [大量编辑]

时间:2009-10-15 07:31:11

标签: c++ string bit-manipulation composite bitset

我有两个十六进制字符串,伴随着掩码,我想合并成一个字符串值/掩码对。字符串可能有重叠的字节但是在应用掩码之后,没有重叠的位应该与该位的值必然相矛盾,即value1 = 0x0A mask1 = 0xFE和value2 = 0x0B,mask2 = 0x0F基本上表示生成的合并必须具有高位半字节全为0,低位半字节必须为01011

我已经使用直接c,将字符串转换为字节数组并将memcpy转换为缓冲区作为原型。它已经过测试,似乎可行。但是,它很丑陋且难以阅读,并且不会因违反特定位要求而抛出异常。我考虑过使用bitset,但还有另外一种方法可能不需要转换开销吗?表现会很好,但并不重要。


编辑:更多细节,虽然写这篇文章让我意识到我已经把一个简单的问题弄得太难了。但是,无论如何它在这里。

我获得了大量输入,这些输入是混合内容文档的二进制搜索。文档分为页面,页面由api提供,一次提供一页。需要使用提供的搜索词搜索每个页面。

我在请求页面之前拥有所有搜索字词。输入是表示十六进制数字的字符串(这是我的十六进制字符串的含义)以及用于指示输入十六进制字符串中有效位的掩码。由于我预先给了所有输入,我想改进每个页面返回的搜索。我想预处理将这些十六进制字符串合并在一起。为了使问题更有趣,每个字符串都有一个可选的偏移量,它们必须出现在页面中,缺少偏移量表示字符串可以出现在所请求页面的任何位置。所以,像这样:

class Input {
  public:
    int input_id;
    std::string value;
    std::string mask;
    bool offset_present;
    unsigned int offset;
};

如果给定的Input对象具有offset_present = false,则忽略分配给offset的任何值。如果offset_present为false,则显然无法与其他输入合并。

为了使问题更有趣,我想报告一个输出,该输出提供有关找到的内容的信息(找到的input_id,偏移量的位置等)。合并一些输入(但不包括其他输入)会使这更加困难。

我曾考虑过定义一个CompositeInput类,并考虑将底层合并作为一个比特集,但是进一步阅读有关bitsets的内容让我意识到这不是我真正想到的。我缺乏经验让我放弃了复合思想并蛮力。我必须跳过有关其他输入类型的一些详细信息,以便在找到输入时为输出收集额外信息(例如,页码,parag。数字)。这是一个示例输出类:

class Output {
  public:
    Output();
    int id_result;
    unsigned int offset_result;
};

如果我合并N个十六进制字符串,我想要产生其中的N个,保持用户隐藏任何合并细节。

3 个答案:

答案 0 :(得分:2)

我不知道hexstring是什么......但除此之外它应该是这样的:

 outcome = (value1 & mask1) | (value2 & mask2);

答案 1 :(得分:0)

听起来像|,&并且〜会工作吗?

答案 2 :(得分:0)

const size_t prefix = 2; // "0x"
const size_t bytes  = 2;
const char* value1 = "0x0A";
const char* mask1  = "0xFE";
const char* value2 = "0x0B";
const char* mask2  = "0x0F";
char output[prefix + bytes + 1] = "0x";

uint8_t char2int[] = { /*zeroes until index '0'*/ 0,1,2,3,4,5,6,7,8,9 /*...*/ 10,11,12,13,14,15 };
char int2char[] = { '0', /*...*/ 'F' };

for (size_t ii = prefix; ii != prefix + bytes; ++ii)
{
    uint8_t result1 = char2int[value1[ii]] & char2int[mask1[ii]];
    uint8_t result2 = char2int[value2[ii]] & char2int[mask2[ii]];
    if (result1 & result2)
        throw invalid_argument("conflicting bits");
    output[ii] = int2char[result1 | result2];
}