2013-04-24 34 views
1

我正在創建一個數據包發送者。將字符串轉換爲字節併發送()它

用戶可以輸入他們想要在RichTextBox上發送的數據包。

this->packetdata = (gcnew System::Windows::Forms::RichTextBox()); 

樣品輸入:

03 00 00 13 0e e0 00 00 00 00 00 01 00 08 00 00 00 00 00 03 
00 00 6a 02 f0 80 7f 65 82 00 5e 04 01 01 04 01 01 01 01 ff 

服務器應該得到:

03 00 00 13 0e e0 00 00 00 00 00 01 00 08 00 00 00 00 00 03 
00 00 6a 02 f0 80 7f 65 82 00 5e 04 01 01 04 01 01 01 01 ff 

但服務器接收到這個來代替:

30 33 20 30 30 20 30 30 20 31 33 20 30 65 20 65 03 00 00 13 0e e 
30 20 30 30 20 30 30 20 30 30 20 30 30 20 30 30 0 00 00 00 00 00 
20 30 31 20 30 30 20 30 38 20 30 30 20 30 30 20 01 00 08 00 00 
30 30 20 30 30 20 30 30 20 30 33 0a 30 30 20 30 00 00 00 03.00 0 
30 20 36 61 20 30 32 20 66 30 20 38 30 20 37 66 0 6a 02 f0 80 7f 
20 36 35 20 38 32 20 30 30 20 35 65 20 30 34 20 65 82 00 5e 04 
30 31 20 30 31 20 30 34 20 30 31 20 30 31 20 30 01 01 04 01 01 0 
31 20 30 31 20 66 66 20       1 01 ff 

如何轉換數據在RichTextBox刪除所有空間並將每個字節視爲字節併發送。

這種方法有效,但:

char this[] = {0x03, 0x00, 0x00, 0x13, 0x0e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 
0x00, 0x00, 0x6a, 0x02, 0xf0, 0x80, 0x7f, 0x65, 0x82, 0x00, 0x5e, 0x04, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0xff} 

與該代碼,服務器接收正確的數據。

那麼如何將文本框內的文本變成類似的東西?


這工作

int mysendfunc(char *sendbuf, int size); 

(...) 

std::string inputpkt = marshal_as<std::string>(this->packetdata->Text); 
std::istringstream reader(inputpkt); 
std::vector<char> pkt; 
do 
{ 
    // read as many numbers as possible. 
    for (int number; reader >> std::hex >> number;) { 
     pkt.push_back(number); 
    } 
    // consume and discard token from stream. 
    if (reader.fail()) 
    { 
     reader.clear(); 
     std::string token; 
     reader >> token; 
    } 
} 
while (!reader.eof()); 

int hehe = mysendfunc(pkt.data(), pkt.size()); 
+1

沒有往上衝的CLI,我不能回答,如果有一個神奇的功能,要做到這一點,我認爲他們這樣做,但是在標準的C++中,我將'istringstream'作爲輸入字符串,然後使用'operator >>()'將格式化的數據抽出,將每個值推入'std :: vector ',最後發送'vec.size()'字節來自'vec.data()' – WhozCraig 2013-04-24 14:28:28

+0

@WhozCraig Th是否可以工作我可以看到一些示例代碼? :) – zikdaljin 2013-04-24 18:44:28

+0

你正在將數據視爲十進制,但它實際上是十六進制。 – 2013-04-24 19:43:25

回答

1

您的功能使用istringstream是非常接近。要將數據解釋爲十六進制數據,您需要使用reader >> hex >> number

然後

mysendfunc(&pkt[0], pkt.size()) 

或者使用

array<String^>^ hexCodes = this->packetdata->Text->Split(" "); 
Converter<String^, SByte>^ parser = gcnew Converter<String^, SByte>(&SByte::Parse); 
array<SByte>^ bytes = Array::ConvertAll(hexCodes, parser); 
pin_ptr<char> pkt = &bytes[0]; 
int x = mysendfunc(pkt, bytes->Length); 
+0

我在'Array :: ConvertAll'和拆分部分出現了一些錯誤。 – zikdaljin 2013-04-24 19:45:22

+0

@zikdaljin:將代碼分割成這樣,現在錯誤是什麼? – 2013-04-24 19:47:47

+0

最後一行'pkt'現在說'cli :: pin_ptr 與char類型的參數不兼容*' – zikdaljin 2013-04-24 19:52:00

0

您發送的ASCII碼爲文本 「03 00 00 ....」。您實際上想要以串行化模式發送字符串「030000 ...」。

std::string str("03 00 00 13 0e e0 00 00 00 00 00 01 00 08 00 00 00 00 00 03 
00 00 6a 02 f0 80 7f 65 82 00 5e 04 01 01 04 01 01 01 01 ff"); 
sendbytes(str.c_str(), str.size()); 
+1

這是不正確的。這只是發送相同的ASCII文本。 – WhozCraig 2013-04-24 14:24:53

相關問題