C#将十六进制字符串发送到tcp套接字

问题描述 投票:2回答:2

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

我写了一个Windows Phone应用程序,它基于Socket Class工作正常。此应用程序模拟请求,通常从桌面程序发送到托管Web服务的设备。

通过wireshark,我发现,webservice将接受一个输入流(以十六进制表示)并返回第二个。十六进制流,包含我需要的数据。

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

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

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

据我所研究62 = b但ff总是发送c3bf。

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

椅子,如果

c# sockets stream request
2个回答
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');

在套接字发送/接收结束时(data == response)。如果没有发生这种情况,您需要确定问题所在。第一步是编写一些非常简单的代码,如下所示:

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

如果可行,则输出'encode'数组可以检查以确保它包含在正在发送的数据包数据中,然后验证这是正在接收的内容。如果你正在发送正确的数据,但收到它已损坏你有严重的问题...我怀疑你发现但是如果是这样的话写一个非常简单的测试程序,在同一台机器上发送和接收(localhost),看看它是否可重复。

如果我不得不猜测我会说正在编码的字符不是Unicode或Win手机不能正确支持它(Proper unicode support)。


0
投票

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

因此,您只需直接定义字节数组,如下所示:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.