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}

そのコードで、サーバーは正しいデータを受け取ります。

では、TextBox 内の Text をそのようなものにするにはどうすればよいでしょうか。


これは機能します

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()); 
4

2 に答える 2

1

あなたの機能の使用istringstreamは本当に近いです。データを 16 進数として解釈するには、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);
于 2013-04-24T19:36:10.907 に答える
0

テキスト「03 00 00 ....」の ASCII コードを送信しています。実際には、シリアル化されたモードで文字列「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());
于 2013-04-24T11:49:18.833 に答える