1

16進文字列を含むCStringからByte配列への変換を実行しようとしていて、

これまでのところ失敗しました。私はフォーラムを見てきましたが、今のところどれも役に立たないようです。ほんの少しの機能はありますか

この変換を行うためのコード行?

私のコード:

BYTE abyData[8];    // BYTE = unsigned char

CString sByte = "0E00000000000400";

期待:

abyData[0] = 0x0E;
abyData[6] = 0x04; // etc.
4

3 に答える 3

3

一度に2つの文字を簡単に飲み込むことができます。

unsigned int value(char c)
{
    if (c >= '0' && c <= '9') { return c - '0'; }
    if (c >= 'A' && c <= 'F') { return c - 'A' + 10; }
    if (c >= 'a' && c <= 'f') { return c - 'a' + 10; }

    return -1; // Error!
}

for (unsigned int i = 0; i != 8; ++i)
{
    abyData[i] = value(sByte[2 * i]) * 16 + value(sByte[2 * i + 1]);
}

もちろん8、配列のサイズにする必要があり、文字列の長さが正確に2倍になるようにする必要があります。これをチェックするバージョンでは、各文字が有効な16進数であることを確認し、そうでない場合は何らかのエラーを通知します。

于 2012-09-19T11:35:54.553 に答える
2

このようなものはどうですか:

for (int i = 0; i < sizeof(abyData) && (i * 2) < sByte.GetLength(); i++)
{
    char ch1 = sByte[i * 2];
    char ch2 = sByte[i * 2 + 1];

    int value = 0;

    if (std::isdigit(ch1))
        value += ch1 - '0';
    else
        value += (std::tolower(ch1) - 'a') + 10;

    // That was the four high bits, so make them that
    value <<= 4;

    if (std::isdigit(ch2))
        value += ch1 - '0';
    else
        value += (std::tolower(ch1) - 'a') + 10;

    abyData[i] = value;
}

注:上記のコードはテストされていません。

于 2012-09-19T11:32:48.873 に答える
1

あなたは出来る:

#include <stdint.h>
#include <sstream>
#include <iostream>

int main() {
    unsigned char result[8];
    std::stringstream ss;
    ss << std::hex << "0E00000000000400";
    ss >> *( reinterpret_cast<uint64_t *>( result ) );
    std::cout << static_cast<int>( result[1] ) << std::endl;
}

ただし、メモリ管理の問題に注意してください。さらに、結果は予想どおり逆の順序になるため、次のようになります。

result[0] = 0x00
result[1] = 0x04
...
result[7] = 0x0E
于 2012-09-19T12:14:58.007 に答える