2010-10-27 72 views
0

我在C#下面的代码:Socket编程 - 发送/接收十六进制和字符串

Console.WriteLine("Connecting to server..."); 
TcpClient client = new TcpClient("127.0.0.1", 25565); 
client.Client.Send(BitConverter.GetBytes(0x02)); 
client.Client.Send(BitConverter.GetBytes(0x0005)); 
client.Client.Send(Encoding.UTF8.GetBytes("wedtm")); 
Console.Write("{0:x2}", client.GetStream().ReadByte()); 

对于我的生活,我无法弄清楚如何转这个红宝石。这里有帮助吗?

这是我到目前为止,但预计它不工作:

require 'socket' 
s = TCPSocket.open("127.0.0.1", 25565) 
s.write(0x02) 
s.write(0x0005) 
s.write("wedtm".bytes) 
response = s.recvfrom(2) 
puts "Response Size #{response.size}: #{response.to_s}" 

的反应应该是0×02

编辑:

我假设我必须使用字符串#unpack然而,我不知道如何让“wedtm”输出到适当的\x000\x000\x000\x000格式。

+0

没什么,它是空白的。 – WedTM 2010-10-27 05:31:40

回答

0

这里要考虑至少两件事情:

  1. 网络字节顺序是大端。这意味着你应该总是以单个字节或字节数组思考,因为字节在更大的类型时不会被混洗。
  2. 丙的#BitConverter.GetBytes(INT16)返回2 bytes in little-endian format和GetBytes会(Int32)返回4 bytes in little-endian format

不知道任何Ruby或它的字符串格式,我猜你需要为第一部分做这样的事情:

s.write("\x02\x00".bytes) 
s.write("\x05\x00\x00\x00".bytes) 

第二部分应该没问题。

WireShark是在调试网络代码和/或反向工程网络协议时记录C#应用程序的流量并与您的差异进行比较的宝贵工具。

相关问题