2011-10-07 13 views
1

バイト配列のバイト数が不明確なIObservable<byte[]>があります。私はそれをどのようにして、それぞれのバイト配列のバイト量を指定してIObservable<byte[]>を返すかを知りたいです。一度に10バイトを必要とすると仮定しましょう。不規則な長さのバイト配列を持つIOBservable <byte[]>をIObservableに変換する<byte[]>通常の長さの配列を持つ

{1, 2, 3, 4} 
{5, 6} 
{7, 8, 9} 
{10} 
{11, 12, 13, 14, 15} 
{16} 
{17, 18} 
{19, 20} 

Bytes.Subscribe(b => Console.WriteLine(b.Length)); 

出力は私が望む何

3 
2 
3 
1 
5 
1 
2 
2 

だろうに、上記の入力を変換することです:私は、次の入力を取得する場合、私は購読した場合、と言うことですが

この:

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 
{11, 12, 13, 14, 15, 16, 17, 18, 19, 20} 

Bytes.<WhateverItTakesToDoThat>.Subscribe(b => Console.WriteLine(b.Length)); 

出力は次のようになり

012バイトの量は単一の出力パケットよりも大きいことに来れば
10 
10 

また、すなわち、働かなければなりません:

{21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32} 
{33, 34, 35, 36, 37, 38, 39, 40, 41} 
{42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52} 

{21, 22, 23, 24, 25, 26, 27, 28, 29, 30} 
{31, 32, 33, 34, 35, 36, 37, 38, 39, 40} 
{41, 42, 43, 44, 45, 46, 47, 48, 49, 50} 

(および上保持することにオンにする必要があり〜{51,52}、より多くの入力が来るのを待つ)

答えて

4

これは簡単です。これを試してみてください:

Bytes 
     .SelectMany(b => b) 
     .Buffer(10) 
     .Select(bs => bs.ToArray()); 
+0

を受信する私のバージョンでは(1.0.10621)SelectManyは唯一のものとはIEnumerableをを返し、IEnumerableを<>はバッファ拡張メソッドを持っていないので、私は間ToObservable()の呼び出しを追加する必要がありましたSelectMany()およびBuffer()。その後、それは美しく動作します、ありがとうございます。 :-) – Alex

+0

@Alex - それは、 'Bytes'が' IEnumerable 'であり、' IObservable 'ではないことが示唆していることを意味します。 'SelectMany'の前に' ToObservable'を置いてみてください。それもうまくいくはずです。 – Enigmativity

+0

ええ、そうです。それは私のせいだ;テスト中にIEnumerable を使用してToObservable()を最初に実行したことを覚えなくても入力を偽装しました。実際の入力はIObservable に直接なります。誤解をおかけして申し訳ありません。 :-) – Alex

1

私は思考と微妙なやりかたの後に1つの解決策を思いついた。次のコードは、私が欲しいものを行います。

Bytes.Select(b => b.ToObservable()) // Convert input to IObservable<IObservable<byte>> 
.Merge(1) // Merges the IObservable<IObservable<byte>> to an IObservable<byte> 
      // with the bytes in the right order 
.Buffer(4) // Wait until we have 4 bytes ready 
.Select(bl => bl.ToArray()) // Take these 4 bytes and turn them back into an array 
.Subscribe(b => Console.WriteLine(b.Length)); 

は、これはおそらく、非効率的で、かつそこに誰かがより良い、より効率的に考え出すことができるので、もし私が、それがこれを行うの彼の最も効率的な方法ではありませんほぼ確実です解決策、私はすべての耳です!

関連する問題