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的功能非常接近。要将数据解释为十六进制,您需要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 回答