none
バイト配列を240バイトごとに区切りたい RRS feed

  • 質問

  • C#2008で開発しています。

    バイト配列(Byte[])がありまして、それを240バイトごと(240要素ごと)に
    List<Byte[]>として分けたいと思っています。
    バイト配列は240バイト以下の場合も、241バイト以上の場合もあります。

    配列を要素数を指定してうまく分けたいと思ったのですが、
    何か良い方法はないだろうかと悩んでおります。

    foreachで240回ずつまわせばできるだろうと思うのですが、
    それ以外に方法はないのだろうかと思っております。

    何か良い案がございましたら、
    ご教示頂けませんか?

    ぜひよろしくお願いいたします。

     

    2009年9月18日 12:13

回答

  • ループで回すのは仕方が無いと

    byte[] bsSource = new byte[300];
    for (int i = 0; i < bsSource.Length; i++)
    {
        bsSource[i] = (byte)(i & 0xff);
    }
    int remain = bsSource.Length;
    int position = 0;
    int split;
    List<byte[]> list = new List<byte[]>();
    while (remain > 0)
    {
        split = remain < 240 ? remain  : 240;
        remain -= split;
        byte[] bs240 = new byte[split];
        Array.Copy(bsSource , position  , bs240 , 0 , split);
        list.Add(bs240);
        position += split;
    }
    • 回答としてマーク コンドル 2009年9月19日 7:10
    2009年9月18日 13:00
  • ArraySegment< T> 構造体を使うのはどうでしょうか?
    • 回答としてマーク コンドル 2009年9月19日 7:10
    2009年9月18日 17:03

すべての返信

  • ループで回すのは仕方が無いと

    byte[] bsSource = new byte[300];
    for (int i = 0; i < bsSource.Length; i++)
    {
        bsSource[i] = (byte)(i & 0xff);
    }
    int remain = bsSource.Length;
    int position = 0;
    int split;
    List<byte[]> list = new List<byte[]>();
    while (remain > 0)
    {
        split = remain < 240 ? remain  : 240;
        remain -= split;
        byte[] bs240 = new byte[split];
        Array.Copy(bsSource , position  , bs240 , 0 , split);
        list.Add(bs240);
        position += split;
    }
    • 回答としてマーク コンドル 2009年9月19日 7:10
    2009年9月18日 13:00
  • ArraySegment< T> 構造体を使うのはどうでしょうか?
    • 回答としてマーク コンドル 2009年9月19日 7:10
    2009年9月18日 17:03
  • gekka様

    Array.Copyメソッドを使えば、
    一気にコピーできるのですね。
    ソースまで付けていただき、とても参考になりました。

    ありがとうございました。

    2009年9月19日 7:01
  • siokoshou様

    ご回答ありがとうございます。

    ArraySegment< T> 構造体でも分割できるようですね。
    以下の内容を読んで理解しました。
    http://msdn.microsoft.com/ja-jp/library/1hsbd92d(VS.80).aspx

    勉強になりました。
    ありがとうございます。
    2009年9月19日 7:10
  • ArraySegment< T> 構造体でも分割できるようですね。
    以下の内容を読んで理解しました。
    http://msdn.microsoft.com/ja-jp/library/1hsbd92d(VS.80).aspx
    念のためですが、補足します。

    ArraySegment<T> はあくまで、「配列、どこから始めるか、何個使うか」をセットで持ったものです。
    分割しているわけではなく、「どこからどこを使ってね」と教えてあげるものです。
    このため、ArraySegment<T> の Array プロパティにアクセスすると、全ての要素を見ることができます。
    (for ループの開始数値を 0 、終了条件を i < arrSeg.Array.Length とすれば全要素を列挙できる)

    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月19日 7:47
    モデレータ
  • Azulean様

    ありがとうございます。
    確認してみました。

    正しく理解しておりませんでした。
    分割はされておらず、要素の範囲を区切っているだけなのですね。

    とても参考になりました。
    2009年9月19日 8:47