バイト配列をC#で特定の配列値で分割する方法は?バイト配列をC#で特定の配列値で分割する方法は?
byte[] largeBytes = [70,68,49,59,117,49,59,112];
私は3バイト配列を得ることができるように、配列 "by"を分割したいだけです。 私は多くを試して、解決策を見つけることができませんでした。事前
バイト配列をC#で特定の配列値で分割する方法は?バイト配列をC#で特定の配列値で分割する方法は?
byte[] largeBytes = [70,68,49,59,117,49,59,112];
私は3バイト配列を得ることができるように、配列 "by"を分割したいだけです。 私は多くを試して、解決策を見つけることができませんでした。事前
はあなたが分割を行うためのIEnumerableのGroupBy
を使用することができ、この
//Here I'm not including 59 in the sub arrays
var largeBytes = new byte[] {70,68,49,59,117,49,59,112};
var lists = new List<List<byte>>();
const int marker = 59;
var tempLst = new List<byte>();
foreach (var largeByte in largeBytes)
{
if (largeByte==marker)
{
lists.Add(tempLst);
tempLst=new List<byte>();
}
else
{
tempLst.Add(largeByte);
}
}
lists.Add(tempLst);
ありがとうございます。 – Abdu
でのおかげであなたは関数が(59
これ以上は配列に見つからない)-1
を返すまでのインデックスが最後、ループ内でのインデックス(最初は0)で発見されるArray.IndexOf(largeBytes, (byte)59, index)
を使用することができます。 (byte)59
によって作成された境界に 、この答えに書かれている通り、いくつかのサブ配列をコピーします。ここGetting a sub-array from an existing array
を達成することができますどのようにアルゴリズムです:
byte[] largeBytes = new byte[] {70,68,49,59,117,49,59,112};
byte split = 59;
long index = 0;
var results = largeBytes.GroupBy(b => index += Convert.ToInt64(b==split));
foreach (var result in results) {
Console.WriteLine($"Group Key: {result.Key}");
foreach (var value in result) {
Console.WriteLine($" - Value: {value}");
}
}
楽しみのためだけに、ここではC#7のタプルを使用してそれを行うための方法です:
byte[] largeBytes = new byte[] {70,68,49,59,117,49,59,112};
byte split = 59;
long index = 0;
var results = largeBytes.Select(x => ((index += Convert.ToInt64(x == 59)),x));
foreach (var tuple in results) {
Console.WriteLine($"{tuple.Item1}: {tuple.Item2}");
}
デモ:http://csharppad.com/gist/079cc46095bb938f716587693d7ea8af
最も簡単な解決策は、MoreLINQからSplit拡張メソッドを使用することである。
byte separator=59;
var triplets=largeBytes.Split(separator);
これはIEnumerable<byte>
のIEnumerableをを返します。あなたはToArray()
でIEnumerable<byte[]>
に変換することができます:
var triplets=largeBytes.Split(separator).Select(triplet=>triplet.ToArray());
それとも、拡張メソッドが何を大まかに行うことができます - それは、セパレータを検出し、アレイ内の各文字を配置するまで、各入力要素をチェックするイテレータを作成します。
public static IEnumerable<List<T>> Split<T>(tihs IEnumerable<T> source, T separator)
{
List<T> result=new List<T>(3);
foreach(T item in source)
{
if (item==separator)
{
yield return result;
result=new List<T>(3);
}
else
{
result.Add(item);
}
}
}
あなたは同じように、この拡張メソッドを使用することができます。
byte separator=59;
var triplets=largeBytes.Split(separator);
または
01それはあなたが分割の最大数を指定するか、またはあなたが にしたい場合は、別の形に入力を変換することを可能にするよう
var triplets=MyExtensionsClass.Split(largeBytes,separator);
MoreLINQのバージョンでは、多くの汎用性があり、セパレータが含まれ、あなたはresult.Add
を置きます最初の前にif
。より良いオプションはinclude
パラメータを追加することです:
public static IEnumerable<List<T>> Split<T>(tihs IEnumerable<T> source, T separator,bool include=false)
{
List<T> result=new List<T>(3);
foreach(T item in source)
{
if (item==separator)
{
if (include) result.Add(item);
yield return result;
result=new List<T>(3);
}
else
{
result.Add(item);
}
}
}
同様の問題:https://stackoverflow.com/questions/38020581/c-sharp-split-byte-by-hexademimal-value-into-new-配列 - バイト/ 38020807。同様の方法でマーカーを使用して小数値に適用できます。 –
59バイトを含めるかどうかは –