1

以下に示すコードは、ビジュアル C++ です。

array<Byte>^ b = gcnew array <Byte> (filesize);
fs->Read(b,0,b->Length);
unsigned char *pb;
pb=(byte*)malloc(b->Length);    //pb is unmanaged here.

for(int i=0;i<b->Length;i++)
{
     *(pb+i)=InverseByte(b+i);
}

以下の関数を呼び出して、各バイトを逆にしたいと思います。これどうやってするの?マネージド配列 b の各バイトを逆にして、アンマネージド配列 b に入れたいと思います。

unsigned char InverseByte(unsigned char* PbByte)
{
    //something;
}
4

4 に答える 4

3

InverseByte の宣言を修正します。

unsigned char InverseByte(unsigned char value)

したがって、次のように使用できます。

for (int i=0; i < b->Length; i++)
{
    pb[i] = InverseByte(b[i]);
}
于 2012-05-15T05:30:04.010 に答える
2

あなたは私が推測するビットごとの否定を意味します。

unsigned char InverseByte(unsigned char c)
{
    return ~c;
}

値へのポインターを渡すのではなく、値で渡すようにパラメーターを変更したことに注意してください。

また、インデックスの代わりにポインター演算を使用している理由もわかりません。それはあなたのコードを読みにくくするだけです。ループは次のように記述します。

for(int i=0;i<b->Length;i++)
{      
    pb[i] = InverseByte(b[i]);
}
于 2012-05-15T06:16:37.340 に答える
1

コメントから、反転(つまり、最大値から変数を減算する)や否定(つまり、1と0を反転する)ではなく、バイトを逆にする(つまり、前から後ろに並べ替える)ことが明らかなので、それに応じて関数に名前を付ける必要があります。

Seanderのビットハックからのすてきなスニペットは次のとおりです。

   unsigned int v;     // input bits to be reversed
   unsigned int r = v; // r will be reversed bits of v; first get LSB of v
   int s = sizeof(v) * CHAR_BIT - 1; // extra shift needed at end

   for (v >>= 1; v; v >>= 1)
   {   
       r <<= 1;
       r |= v & 1;
       s--;
   }

   r <<= s; // shift when v's highest bits are zero
   return r;

Hans Passantの答えをこれと組み合わせると、機能をまとめるためのすべての要素が必要になります。

于 2012-05-15T16:05:39.720 に答える
1
unsigned char InverseByte(unsigned char c)
{
    return (c>>7)|((c&64)>>5)|((c&32)>>3)|((c&16)>>1)|((c&8)<<1)|((c&4)<<3)|((c&2)<<5)|((c&1)<<7);
}
于 2012-05-15T09:12:32.513 に答える