簡體   English   中英

C ++中的十六進制字符串運算

[英]hex string arithmetic in c++

我想用表示為字符串的64位十六進制數字進行基本算術(加,減和比較)。 例如

"ffffa"+"2" == "ffffc"

由於此類數字的二進制表示形式需要256位,因此我無法將字符串轉換為基本整數類型。 一種解決方案是使用gmpboost/xint但是對於這種簡單功能boost/xint ,它們太大了。

有沒有可以幫助我的輕巧解決方案?

自己對固定基數的字符串進行加,減和比較應該很容易。

例如,對於加法和減法,只需像您在紙上所做的那樣簡單:從兩個字符串的右端開始,分析char ,計算結果,然后進行累加等等。比較更加容易,並且您從左到右。

當然,所有這些都是假設您不需要性能(否則您應該使用適當的庫)。

只需編寫一個庫即可處理在十六進制到int之間轉換的字符串,並一次添加一個char,以防溢出。 花了幾分鍾來實現這樣的算法:

#include <cstdio>
#include <sstream>
#include <iostream>

using namespace std;

namespace hexstr {
    char int_to_hexchar(int v) {
        if (0 <= v && v <= 9) {
            return v + '0';
        } else {
            return v - 10 + 'a';
        }
    }
    int hexchar_to_int(char c) {
        if ('0' <= c && c <= '9') {
            return c - '0';
        } else {
            return c - 'a' + 10;
        }
    }
    int add_digit(char a, char b) {
        return hexchar_to_int(a) + hexchar_to_int(b);
    }
    void reverseStr(string& str) { 
        int n = str.length(); 
        for (int i = 0; i < n / 2; i++) 
            swap(str[i], str[n - i - 1]); 
    }
    void _add_val_to_string(string& s, int& val) {
        s.push_back(int_to_hexchar(val % 16));
        val /= 16;
    }
    string add(string a, string b)
    {
        auto ita = a.end();
        auto itb = b.end();
        int tmp = 0;
        string ret;

        while (ita != a.begin() && itb != b.begin()) {
            tmp += add_digit(*--ita, *--itb);
            _add_val_to_string(ret, tmp);
        }
        while (ita != a.begin()) {
            tmp += hexchar_to_int(*--ita);
            _add_val_to_string(ret, tmp);
        }
        while (itb != b.begin()) {
            tmp += hexchar_to_int(*--itb);
            _add_val_to_string(ret, tmp);
        }
        while (tmp) {
            _add_val_to_string(ret, tmp);
        }

        reverseStr(ret);

        return ret;
    }
}

int main()
{
    std::cout 
        << "1bd5adead01230ffffc" << endl
        << hexstr::add(
                std::string() + "dead0000" + "00000" + "ffffa", 
                std::string() + "deaddead" + "01230" + "00002"
        ) << endl;
    return 0;
}

可以對其進行優化,可以省略反向字符串,並節省一些cpu周期和內存分配。 而且缺少錯誤處理。 它僅適用於使用ASCII表作為字符集的實現,依此類推...但是它是如此簡單。 我猜想這個小庫可以處理任何超過64位的十六進制字符串,這僅取決於主機內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM