C ++十六进制字符串到字节数组

时间:2011-07-08 19:36:06

标签: .net string c++-cli bytearray hex

我正在尝试通过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

在C ++中使用UdpClient。

string^转换为 array< Byte >^的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

这对我有用,虽然我还没有很好地测试错误检测。

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;
    }
};

答案 1 :(得分:0)

如果您尝试将其作为ascii字节发送,那么您可能需要System::Text::Encoding::ASCII::GetBytes(String^)

如果你想首先将字符串转换为一堆字节(所以发送的第一个字节是0x11),你需要根据空格分割字符串,在每个字符串上调用Convert::ToByte(String^, 16),然后将它们放入要发送的数组。