我有一個高大小的位元組陣列。該陣列中有多個包。不清楚有多少個包。
包結構=> 頭(0xAA 0xFE) 長度(2位元組) 資料(長度位元組) 校驗和(2位元組)
我想把大陣列里面的包分成獨立的陣列。下面的演算法可以做到這一點。是否可以用LINQ來做這件事呢?
我想學習的是我們如何用LINQ來控制復雜的結構。
您能幫助我了解是否可以用LINQ來完成嗎?從現在開始謝謝你。
List<byte[]> allPacket = new List<byte[]> ()。
public void LogReadBuffer(byte[] buffer)
{
try
{
for(long i = 0; i < buffer.Length;)
{
if(buffer[i] == (char)0xAA & & buffer[i 1] == 0xFE && Step == 0)
{
Lenght = (short)(
((byte)buffer[i 2] << 8)
((byte)buffer[i 3] << 0)) 。
packet = new byte[Lenght 6] 。
Step = 1;
}
else if(Step == 1)
{
for (int packetCounter = 0; packetCounter < Lenght 6; packetCounter )
{
packet[packetCounter] = buffer[i ]。
}
allPacket.Add(packet)。
Step = 0;
}
}
}
catch { }
}
uj5u.com熱心網友回復:
雖然我同意內置的LINQ并不適合不規則分組,但是如果你愿意事后驗證包,或者可能有較差的錯誤處理,那么擴展方法就能成為一個簡單的LINQ陳述句。
這個擴展方法通過使用一種方法來確定下一個資料 "塊 "的大小,根據資料進行分組。
public static class LINQExt {
// int ChunkSizeFn(T[] data, int start) - 回傳開始時塊的大小。
public static IEnumerable< T[]> GroupByFunc< T>(this T[] data, Func< T[], int, int> ChunkSizeFn) {
int offset = 0;
while (offset < data.Length) {
var currentChunkLen = ChunkSizeFn(data, offset) 。
yield return new ArraySegment<。 T>(data, offset, currentChunkLen) 。 ToArray()。
offset = currentChunkLen。
}
}
使用這個擴展方法,你可以拉出塊:
var allPackages = buffer.GroupByFunc((data,start) => (data[start 2] << 8) data[start 3] 6).ToList()。
要過濾到只有具有有效頭資訊的包,添加一個Where:
var allPackages = buffer
.GroupByFunc((data,start) => (data[start 2] << 8) data[start 3] 6)
.Where(p => p[0] == 'xAA' && p[1] == 'xFE')
.ToList()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/310103.html
標籤:
上一篇:通過多個值進行Linq排序
