0

次の表現を持つ8ビットの配列があります。 Data[i] = 192=11000000、、data[i+1]= 85=01010101表現を 16 ビット配列に変換する必要がありnewArr[i] =343=101010111ます。同じ数字が右にシフトしただけです。私の最初のアイデアは、フィールド i have bpp (ビット数 = 10) を使用することでした。だからvar t=16-10Data[i] >>t. しかし、Data[i+1]>>tこれは正しい答えを与えません。助けてください

4

3 に答える 3

1

私はあなたの質問を、あなたがこの変換をしたいという意味だとaaaaaaaa解釈bbbbbbbbbbbbbbbbaaaaaaaaます000000bbbbbbbbaa

次に、これがあなたのコードになります:

using System;

public class Test
{
  public static void Main()
  {
    byte[] src = new byte[2] { 192, 85 };
    ushort[] tgt = new ushort[1];

    for ( int i = 0 ; i < src.Length ; i+=2 )
    {
      tgt[i] = (ushort)( ( src[i+1]<<8 | src[i] )>>6 );
    }
    System.Console.WriteLine( tgt[0].ToString() );
  }
}

C# には循環シフト演算子がないため、実行したいことが に結合する場合は、2 番目のステップでaを実行aaaabbbbbbbbaaする必要があります。|src[i]<<10

于 2013-05-04T23:28:18.197 に答える
0

私の最終的なコード:D

 public override short[] GetShortDataAlignedRight()
    {
        short[] ReturnArray = new short[_channels[0].Data.Length / 2];
        if (_channels[0].Bpp == 8)
        {
            Buffer.BlockCopy(_channels[0].Data, 0, ReturnArray, 0, _channels[0].Data.Length);
        }
        else
        {
            short tempData;
            int offsetHigh = 8 - (16 - _channels[0].Bpp);
            int offsetLow = (16 - _channels[0].Bpp);
            for (int i = 0, j = 0; i < _channels[0].Data.Length; i += 2, j++)
            {
                tempData = (short)(_channels[0].Data[i] >> offsetLow);
                tempData |= (short)(_channels[0].Data[i + 1] << offsetHigh);
                ReturnArray[j] = tempData;
            }
        }
        return ReturnArray;
    }
于 2013-05-05T13:27:20.787 に答える