5

私は TCP プロトコルを使用しており、ソケットから読み取り、データを byte[] 配列に書き込みます。
これが私のデータの例です:

94 39 E5 D9 32 83
D8 5D 4C B1 CB 99 
08 00 45 00 00 98 
41 9F 40 00 6C 06 
9C 46 26 50 48 7D 
C0 A8 01 05 03 28

サイズが 1024 の byte[] 配列を作成しました。次に、このメソッドを使用して null インデックスを削除します。

public void Decode(byte[] packet)
{
    byte[] temp;
    int c = 0;
    foreach(byte x in packet)
        if (x != 0)
            c++;
    temp = new byte[c];
    for (int i = 0; i < c; i++)
        temp[i] = packet[i];
    MessageBox.Show(temp.Length.ToString());
}

ただし、有用なデータである可能性がある 0x00 インデックスも削除します...
ゼロ以外のデータ (末尾の 0) でラップされていない 0 を削除するにはどうすればよいですか?

4

7 に答える 7

15

これは、配列から末尾のゼロを削除する非常に短く高速な関数です。

public static byte[] TrimEnd(byte[] array)
{
    int lastIndex = Array.FindLastIndex(array, b => b != 0);

    Array.Resize(ref array, lastIndex + 1);

    return array;
}
于 2014-12-01T09:25:01.013 に答える
12

TCP ソケットから読み取っているコードを修正して、後で破棄するつもりのものを読み取らないようにする必要があります。私には無駄に思えます。

しかし、質問に答えるために、ゼロ以外のバイトに遭遇するまで逆の順序でカウントを開始できます。このゼロ以外のバイトのインデックスを特定したら、ソース配列からターゲット配列に単純にコピーします。

public byte[] Decode(byte[] packet)
{
    var i = packet.Length - 1;
    while(packet[i] == 0)
    {
        --i;
    }
    var temp = new byte[i + 1];
    Array.Copy(packet, temp, i + 1);
    MessageBox.Show(temp.Length.ToString());
    return temp;
}
于 2012-06-29T14:20:15.643 に答える
1

定義により配列のサイズを縮小することはできないため、代わりに動的データ構造を使用する必要があります。

たとえば、リストを使用します

List<byte> byteList;

バイト配列を繰り返し処理し、各値 != 0 を byteList に追加します。byteArray のデータの最後に到達したら、反復を中断して配列を破棄し、byteList を使用します。

for (int i = 0; i <= byteArray.Length; i++) {

    if (byteArray[i] != 0) {

        byteList.Add(byteArray[i]);
    } else {

         break;
    }

}

配列を使用したい場合は、リストから直接作成できます

byte[] newByteArray = byteList.ToArray();
于 2012-06-29T14:21:18.607 に答える
0

実際、非常に近い例が MSDN サイトに掲載されています。本当にC# 4.5スタイル - with Predicate<T>. 必要に応じて試すことができます(正解はすでに提出されていますが)

MSDN: 述語デリゲート

PS私はまだ最後のLinqスタイルの答えSelect()を待っています.ToList<byte[]>()

于 2012-06-29T15:01:59.827 に答える
0

では0x00、末尾の s を削除して新しい配列にコピーしますか? それは次のようになります。

int endIndex = packet.Length - 1;
while (endIndex >= 0 && packet[endIndex] == 0)
    endIndex--;

byte[] result = new byte[endIndex + 1];
Array.Copy(packet, 0, result, 0, endIndex + 1);

もちろん、おそらく最後にも何とか有効な0x00s が存在する可能性があります。

于 2012-06-29T14:21:25.483 に答える