我正在使用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 []数组。现在我使用这个方法从中删除空索引:
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)?
答案 0 :(得分:9)
你应该修复从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;
}
答案 1 :(得分:8)
这是一个非常简短的快速函数,用于从数组中修剪尾随零。
public static byte[] TrimEnd(byte[] array)
{
int lastIndex = Array.FindLastIndex(array, b => b != 0);
Array.Resize(ref array, lastIndex + 1);
return array;
}
答案 2 :(得分: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();
答案 3 :(得分:0)
所以你想在最后修剪0x00
并将其复制到一个新数组中?那将是:
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);
虽然当然可能最终也会以某种方式有效0x00
。
答案 4 :(得分:0)
实际上在MSDN网站上给出了非常接近的例子。真的是C#4.5风格 - Predicate<T>
。你可以尝试一下(虽然已经提交了正确答案)
P.S。我仍然在等待Select()
和.ToList<byte[]>()
结束时的Linq风格回答
答案 5 :(得分:0)
Byte[] b = new Byte[1024]; // Array of 1024 bytes
List<byte> byteList; // List<T> of bytes
// TODO: Receive bytes from TcpSocket into b
foreach(var val in b) // Step through each byte in b
{
if(val != '0') // Your condition
{
}
else
{
bytelist.Add(val); //Add the byte to the List
}
}
bytelist.ToArray(); // Convert the List to an array of bytes
答案 6 :(得分:0)
有一个不错的单行解决方案纯LINQ:
public static byte[] TrimTailingZeros(this byte[] arr)
{
if (arr == null || arr.Length == 0)
return arr;
return arr.Reverse().SkipWhile(x => x == 0).Reverse().ToArray();
}