2017-06-21 30 views
0

バイト配列をC#で特定の配列値で分割する方法は?バイト配列をC#で特定の配列値で分割する方法は?

byte[] largeBytes = [70,68,49,59,117,49,59,112]; 

私は3バイト配列を得ることができるように、配列 "by"を分割したいだけです。 私は多くを試して、解決策を見つけることができませんでした。事前

+0

同様の問題:https://stackoverflow.com/questions/38020581/c-sharp-split-byte-by-hexademimal-value-into-new-配列 - バイト/ 38020807。同様の方法でマーカーを使用して小数値に適用できます。 –

+1

59バイトを含めるかどうかは –

答えて

0

はあなたが分割を行うための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); 
+0

ありがとうございます。 – Abdu

0

でのおかげであなたは関数が(59これ以上は配列に見つからない)-1を返すまでのインデックスが最後、ループ内でのインデックス(最初は0)で発見されるArray.IndexOf(largeBytes, (byte)59, index)を使用することができます。 (byte)59によって作成された境界に 、この答えに書かれている通り、いくつかのサブ配列をコピーします。ここGetting a sub-array from an existing array

0

を達成することができますどのようにアルゴリズムです:

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

0

最も簡単な解決策は、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); 
     } 
    } 
} 
関連する問題