【问题标题】:C# Sockets byte arrayC# Sockets 字节数组
【发布时间】:2019-03-19 01:41:01
【问题描述】:

好的,我正在从请求中接收字节..

我打电话来读取字节

        byte[] buffer = new byte[1024];
        int resp = socket.Receive(buffer);

如果我用这个,

 Console.WriteLine(resp)

它返回一个整数 9,表示接收到 9 个字节

当我使用时

 int byte1 = buffer[0];
 Console.WriteLine(byte1);

返回

0

那么当我使用时

        long bytelong = BitConverter.ToInt64(buffer, 0);
        Console.WriteLine(bytelong);

我希望

 0( + other 7 bytes from the array )

但我收到的是

 -1249284928492

这是错误的,因为我知道第一个字节是

0

真的很困惑……

【问题讨论】:

  • 你能添加你收到的前 8 个字节吗
  • 您可能希望使用 BitConverter.ToUInt64 并将值显示为十六进制以更清晰:Console.WriteLine ("{0:X}", bytelong);
  • -1249284928492 作为 8 字节十六进制数是 FFFFFEDD20D0CC14。换句话说,LSB 是 0x14,因此您的 byte[] 不可能在第一个元素处包含 0。因此,您在帖子中提供的信息完全不正确。您的数组以值 0 开头,或者将其传递给 ToInt64() 返回 -1249284928492。两种说法不能同时为真。您至少需要提供一个逻辑上一致的问题,并且实际上您应该提供一个良好的minimal reproducible example 以可靠地重现问题。
  • 那么 @PeterDuniho 为什么 int byte1 = buffer[0];返回 0...?
  • "为什么 int byte1 = buffer[0]; 返回 0" -- 如果你在调用 ToInt64() 时确实得到了数字 -1249284928492,那么它确实不返回 0。我不知道你为什么认为它会,但正如我已经说过的:这两个陈述根本不可能都是真的。要么数组中的第一个字节为 0,要么调用ToInt64() 时返回的数字为-1249284928492。由于您没有提供演示您声称的行为的代码示例,因此无法确定您的观察出错的地方。但我向你保证,它有。

标签: c# arrays sockets bitconverter


【解决方案1】:

不可能从给出的信息中确切知道您的具体问题是什么,但这里有一些关于调试网络通信的一般建议可能会有所帮助。

最重要的是能够在应用程序解释和转换之前准确地看到正在发送和接收的数据。最好的方法是使用外部线路监控软件,例如WireShark。如果您要做很​​多这样的事情,请熟悉这样的工具。

但对于大多数工作来说,这可能是矫枉过正。只需记录您在转换它们之前发送和接收的实际字节,例如:

var count = socket.Receive(buffer);
Console.WriteLine("Received {0} bytes: {1}", count, BitConverter.ToString(buffer, 0, count));

其次,在将字节流解释为二进制整数时,请注意byte ordering issues。如果您不确定发送方和接收方将使用相同的字节顺序,请考虑使用 Network Byte Order(又名 Big Endian)作为多字节二进制值。

例如,假设您的 c# 套接字应用程序在 Windows 上运行,您的 64 位整数值很可能会以小端序存储:

long le_value = 0x0807060504030201; // "01-02-03-04-05-06-07-08"
long be_value = IPAddress.HostToNetworkOrder(le_value); // "08-07-06-05-04-03-02-01"

将接收到的网络字节顺序值转换回小端:

ulong le_value = IPAddress.NetworkToHostOrder(be_value);

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2010-11-26
    相关资源
    最近更新 更多