2

我正在尝试将十六进制字符串发送到 tcp 套接字。我对这个字符串的格式或转换有一些问题,因为我不太确定它使用的是什么格式。

我编写了一个基于 Socket Class 运行良好的 WindowsPhone 应用程序。此应用程序模拟请求,通常从桌面程序发送到托管 Web 服务的设备。

通过wireshark,我发现网络服务将接受一个输入流(认为它是十六进制的)并返回一个第二个。包含我需要的数据的十六进制流。

因此,桌面应用程序正在发送一个流,Wireshark 会在以下时间显示:

数据(8 字节) 数据:62ff03fff00574600 长度:8

现在我已经尝试了很多来重现这个流。我想,它曾经是一个 UTF8 字符串,并将这个流转换为这种格式。但是每次我发送它时,都会在 Wireshark 中看到以下输出:62c3bf03c3bf00574600

据我调查 62 = b 但 ff 总是发送 c3bf。

有人知道如何以正确的格式发送这个流吗?

干杯,乔

4

2 回答 2

0

只要您不知道服务器期望的协议/编码,您就只能重播已知消息,例如您在问题中提供的字节。

因此,您只需像这样直接定义字节数组:

byte[] payload = new byte[] {0x62, 0xff, 0x03, 0xff, 0xf0, 0x05, 0x74, 0x60};

并像之前使用编码字符串一样通过套接字发送它。服务器现在应该接受消息,就像它是由您嗅探的客户端发送的一样。

于 2013-09-30T13:38:40.290 回答
0

套接字传输不应该关心,TCP数据包的内容是二进制表示“随便”。从您在评论中指出的代码:

byte[] payload = Encoding.UTF8.GetBytes(data);
socketEventArg.SetBuffer(payload, 0, payload.Length);
...
response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
response = response.Trim('\0');

在套接字发送/接收结束时(数据 == 响应)。如果没有发生这种情况,您需要弄清楚问题出在哪里。第一步是编写一些非常简单的代码,如下所示:

string source = "your problem text string";
byte[] encode = Encoding.UTF8.GetBytes(source);
target = Encoding.UTF8.GetString(encode, 0, encode.Length);
Debug.Assert(source == target);

如果可行,则输出“编码”数组可以检查以确保它包含在正在发送的数据包数据中,然后验证这是正在接收的内容。如果您正在发送正确的数据但接收到的数据已损坏,那么您会遇到严重的问题......我怀疑您是否发现了这一点,但如果是这样,请编写一个非常简单的测试程序,在同一台机器(本地主机)上发送和接收,看看它是否可重复。

如果我不得不猜测,我会说被编码的字符不是 Unicode,或者 Win 手机没有正确支持它(正确的 unicode 支持)。

于 2013-09-29T15:47:34.813 回答