【问题标题】:C# remove nulls from the end of Byte[512]C#从字节末尾删除空值[512]
【发布时间】:2011-02-27 08:47:33
【问题描述】:

从我的字节 [512] 中删除多余的 00-00-00-00-00 的最佳方法是什么?

目前,当我从收到的不是 512 字节的数据包中加载一些数据时,它会返回类似

    Byte[] received = new Byte[512];
    int Recieving = Sockitty.ReceiveFrom(received, ref endPoint132);
    string dataReceived = BitConverter.ToString(received);
    txtReceived.AppendText(dataReceived);
    //Outputs the following
    74 68 69 73 20 69 73 20 61 
    20 74 65 73 74 00 68 65 6c 
    6c 6f 20 00 68 65 72 65 2e
    **00** 00 00 00 00 00 00 00 00 //This is the part that needs to be removed but the stared 00.
    00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 ... and so on

我怎样才能只删除到最后的 00?如您所见,数据包本身内部有 00,我不想删除。

最好的方法是反转然后循环,直到它碰到 00 以外的东西,然后从那时起将它加载到一个新的字节数组中?我怎么知道要将它加载到什么大小的数组中?

我很困惑。任何帮助表示赞赏。谢谢!

【问题讨论】:

  • 你有关于哪一部分是数据,哪一部分是填充的任何信息吗?如果没有……那么做 o 是危险的……
  • 你调用哪种方法来读取数据?通常,读取的数据长度会返回给您,因为读取的数据量可能小于请求的长度。然后,您只需将与数据的交互限制在此长度即可。
  • 用我正在做的读取数据编辑 OP。

标签: c# arrays null byte trim


【解决方案1】:

Socket.ReceiveFrom 的这个重载返回读入数组的字节数;尊重数组的内容直到这个长度,或者,如果你真的需要,将数组的大小调整到这个长度。

【讨论】:

  • +1 这解决了根本原因。如果您需要将内容传输到Recieving 大小的新数组,请使用Array.Copy
  • 这是实现 E3pO 期望的唯一正确方法。删除从末尾到第一个非零字节的所有零将删除读入数据中的所有尾随零。
【解决方案2】:

您可以从末尾查找第一个非零值,然后将该数据复制到新数组中:

int len = 512;
while (len > 0 && received[len - 1] == 0) {
  len--;
}
{
byte[] cropped = new byte[len];
if (len > 0) {
  Array.Copy(received, 0, cropped, 0, len);
}
received = cropped;

如果可能,您应该尝试找出数据的实际大小,而不是寻找非零值。数据末尾可能包含不应删除的零值。

编辑:

ReceiveFrom 方法返回您在缓冲区中收到的字节数,因此您应该使用它:

byte[] received = new Byte[512];
int len = Sockitty.ReceiveFrom(received, ref endPoint132);
byte[] cropped = new byte[len];
Array.Copy(received, 0, cropped, 0, len);
received = cropped;

【讨论】:

  • 您的编辑工作完美。这将被标记为正确答案。还要感谢@Peter Huene 和其他回答这个问题的人。
【解决方案3】:

你可以通过 linq 简单地做到这一点:

received = received.Reverse().SkipWhile(x => x == 0).Reverse().ToArray();

因为您的输入大小很小,所以没有性能问题,除非您在短时间内调用了太多(在这种情况下您可以正常迭代数组)。但我认为你的接收比这部分代码更耗时。

编辑:对于您的评论案例:

received = received.Reverse()
          .SkipWhile((x,i) => x == 0 && received[512 - i - 2] == 0).Reverse().ToArray();

【讨论】:

  • 字节[]没有.Reverse()
  • @E3pO:如果您使用的是 .NET 3.5 并且有 System.Linq 的 using 指令。基本上,这是一个基于 LINQ 的解决方案。
  • 完美运行.. 现在我如何在最后添加一个 00?
  • @E3pO,如果你没有 00 偷,你想加吗?
  • 这个解决方案很好。简单、优雅、高效。谢谢!
【解决方案4】:
byte[] getclear()
{
    int length = 512;
    int first_nonzero_reversed = 0;
    byte[] received = new byte[length];
    //get data
    for (int i = length - 1; i >= 0; i--)
    {
        if (received[i] != 0)
        {
            first_nonzero_reversed = i;
            break;
        }
    }
    byte[] target = new byte[first_nonzero_reversed + 1];
    Array.Copy(received, target, target.Length);
    return target;
}

【讨论】:

    【解决方案5】:
    byte[] buf;
    
    ...
    
    int length;
    for(length = buf.length -1; i--; (i>=0) && buf[length] == 0)
        continue;
    
    byte[] cleanData = new byte[++length];
    Array.Copy(buf, 0, cleanData, 0, length);
    

    【讨论】:

    • 这将创建一个太短一个字节的数组,它总是会切断一个字节的非零数据。
    猜你喜欢
    • 2010-09-19
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多