C ++ шестнадцатеричная строка в байтовый массив - PullRequest
0 голосов
/ 08 июля 2011

Я пытаюсь отправить строку шестнадцатеричных значений через udp,

11 22 33 44 37 4D 58 33 38 4C 30 39 47 35 35 34 31 35 31 04 D7 52 FF 0F 03 43 2D AA

с использованием UdpClient в C ++.

Какой лучший способ конвертировать string^ в array< Byte >^?

Ответы [ 2 ]

1 голос
/ 09 июля 2011

Это работает для меня, хотя я не очень хорошо тестировал обнаружение ошибок.

ref class Blob
{
    static short* lut;
    static Blob()
    {
        lut = new short['f']();
        for( char c = 0; c < 10; c++ ) lut['0'+c] = 1+c;
        for( char c = 0; c < 6; c++ ) lut['a'+c] = lut['A'+c] = 11+c;
    }
public:
    static bool TryParse(System::String^ s, array<System::Byte>^% arr)
    {
        array<System::Byte>^ results = gcnew array<System::Byte>(s->Length/2);
        int index = 0;
        int accum = 0;
        bool accumReady = false;
        for each (System::Char c in s) {
            if (c == ' ') {
                if (accumReady) {
                    if (accum & ~0xFF) return false;
                    results[index++] = accum;
                    accum = 0;
                }
                accumReady = false;
                continue;
            }
            accum <<= 4;
            accum |= (c <= 'f')? lut[c]-1: -1;
            accumReady = true;
        }
        if (accumReady) {
            if (accum & ~0x00FF) return false;
            results[index++] = accum;
        }
        arr = gcnew array<System::Byte>(index);
        System::Array::Copy(results, arr, index);
        return true;
    }
};
0 голосов
/ 08 июля 2011

Если вы пытаетесь отправить это как байты ascii, то вы, вероятно, хотите System::Text::Encoding::ASCII::GetBytes(String^).

Если вы хотите сначала преобразовать строку в набор байтов (таким образом, первый отправленный байт равен 0x11), вам нужно разделить строку на основе пробелов, вызвать Convert::ToByte(String^, 16) для каждого и поместить их в массив отправить.

...