2011-07-08 109 views
0

我試圖通過udp發送十六進制值的字符串,C++十六進制字符串到字節數組

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 

string^轉換爲 array<Byte>^的最佳方式是什麼?

+1

可能重複[你怎麼轉換字節數組十六進制字符串,反之亦然,在C#中?(http://stackoverflow.com/questions/311165/how-do-you-convert-byte -array-to-hexadecimal-string-and-vice-versa-in-c)(從C#到它的C++/CLI等價物的轉換是微不足道的。) –

+0

從哪裏得到該字符串? – svick

回答

0

如果你試圖發送ascii字節,那麼你可能想要System::Text::Encoding::ASCII::GetBytes(String^)

如果你想將字符串轉換到一個一堆字節(所以發送第一個字節是0×11),你要根據空格分割你的字符串,調用每個Convert::ToByte(String^, 16),並把它們放到一個數組發送。

+0

雖然將C#轉換爲C++/CLI很容易,但並不像在每種類型的末尾標記'^'那麼簡單。 –

+0

已修復,除非實際編譯檢查。 –

+0

'System :: String'有一個大寫字母S.小寫字母''是一個C#關鍵字,也是一個本地C++類型'std :: string',但絕不意味着.NET字符串。 (是的,我知道這個問題也錯了。) –

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; 
    } 
}; 
相關問題