我試圖通過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>^
的最佳方式是什麼?
我試圖通過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>^
的最佳方式是什麼?
如果你試圖發送ascii字節,那麼你可能想要System::Text::Encoding::ASCII::GetBytes(String^)
。
如果你想將字符串轉換到一個一堆字節(所以發送第一個字節是0×11),你要根據空格分割你的字符串,調用每個Convert::ToByte(String^, 16)
,並把它們放到一個數組發送。
雖然將C#轉換爲C++/CLI很容易,但並不像在每種類型的末尾標記'^'那麼簡單。 –
已修復,除非實際編譯檢查。 –
'System :: String'有一個大寫字母S.小寫字母''是一個C#關鍵字,也是一個本地C++類型'std :: string',但絕不意味着.NET字符串。 (是的,我知道這個問題也錯了。) –
這適用於我,雖然我還沒有測試過錯誤檢測。
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;
}
};
的
可能重複[你怎麼轉換字節數組十六進制字符串,反之亦然,在C#中?(http://stackoverflow.com/questions/311165/how-do-you-convert-byte -array-to-hexadecimal-string-and-vice-versa-in-c)(從C#到它的C++/CLI等價物的轉換是微不足道的。) –
從哪裏得到該字符串? – svick