0

unsigned long を 8 ビットの 16 進文字列に変換する C++ 関数があります。8 ビットの 16 進文字列を取り、それをバイトを表す符号なし整数に変換する逆関数を考え出す必要があります。

元の UINT -> char[8] メソッド:

std::string ResultsToHex( unsigned int EncodeResults)
{

        std::cout << "UINT Input ==>";
        std::cout << EncodeResults;
        std:cout<<"\n";

        char _HexCodes[] = "0123456789ABCDEF";
        unsigned int HexAccum = EncodeResults;
        char tBuf[9];
        tBuf[8] = '\0';
        int Counter = 8;
        unsigned int Mask = 0x0000000F;
        char intermed;

        // Start with the Least significant digit and work backwards

        while( Counter-- > 0 )
        {

            // Get the hex digit
            unsigned int tmp = HexAccum & Mask;

            intermed = _HexCodes[tmp];

            tBuf[Counter] = intermed;

            // Next digit
            HexAccum = HexAccum >> 4;
        }

        std::cout << "Hex char Output ==>";
        std::cout << tBuf;
        std::cout << "\n";

        return std::string(tBuf);
    }

そして、これが私が書き込もうとしている関数で、入力としてchar [8]を受け取り、UINTに変換します。

 unsigned int ResultsUnhex( char tBuf[9])
{
        unsigned int result = 0;
        std::cout << "hex char Input ==>";
        std::cout << tBuf;
        std:cout<<"\n";

        //CODE TO CONVERT 8 char (bit) hex char into unsigned int goes here......
        //
        // while() {}
        //
        ///


        std::cout << "UINT Output ==>";
        std::cout << result;
        std::cout << "\n";

        return result;
    }

私はビットシフトが初めてです。どんな助けでも大歓迎です:)。

4

2 に答える 2

2

文字列をスキャンし、各 16 進数文字を対応する 4 ビット バイナリ値に変換する必要があります。ifこれは、文字をチェックして有効かどうかを確認し、有効な場合は元に戻す単純な一連のステートメントで行うことができます。

文字が変換された後、結果変数を 4 ビット左にシフトし、変換された値を結果の下位 4 ビットに詰め込みます。

#include <stdexcept>

unsigned int ConvertHexString(char *str)
{
    unsigned int result = 0;
    while(*str)
    {
        char ch = *str++;

        // Check for 0, 1, 2, 3, 4, 5, 6, 7, 8, and 9
        if(ch >= '0' && ch <= '9')
        {
            ch -= '0';
        }
        // Check for a, b, c, d, e, f
        else if(ch >= 'a' && ch <= 'f')
        {
            ch = 10 + (ch - 'a');
        }
        // Check for A, B, C, D, E, F
        else if(ch >= 'A' && ch <= 'F')
        {
            ch = 10 + (ch - 'A');
        }
        // Opps! Invalid character
        else
        {
            throw std::invalid_argument("Unknown character in hex string");
        }


        // Mmmm! Stuffing! Don't forget to check for overflow!
        result = (result << 4) | ch;
    }

    return result;
}

これを行うにはいくつかの方法がありますが、開始するための簡単な例がより役立つと考えました。

変換関数を使用した必須の例。

#include <iostream>
int main()
{
    std::cout
        << std::hex
        << ConvertHexString("1234567")
        << ConvertHexString("90ABCDEF")
        << std::endl;
}

出力...

123456790abcdef

于 2013-07-02T22:45:37.117 に答える
0

なぜ手動で行うのですか?それを行うツールはたくさんあります。たとえば、stringstream.

これは、int を 16 進文字列に変換します。

std::stringstream stream;
stream << std::hex << your_int;
std::string result( stream.str() );

[ C++ で Integer から 16 進文字列にコピーされたコード- そのスレッドを参照してください。多くの例があります。ここではなくそこに賛成票を投じてください。]

その「0x」といくつかのフィールド幅マニピュレータに追加すると、ResultsToHex3..5 行に減らすことができます。

stringstream は別の方法でも機能します。演算子を使用>>すると、16 進文字列を整数変数に簡単に読み込むことができます。[ 16 進数から 10 進数への変換C++での16 進文字から int への変換、16 進バッファを unsigned int への変換、...]

于 2013-07-02T22:07:40.523 に答える