visual c ++:如何将指针作为参数传递给数组?

时间:2012-05-15 05:20:59

标签: c++ visual-c++ c++-cli

下面显示的代码是visual 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 个答案:

答案 0 :(得分:3)

修复InverseByte的声明:

unsigned char InverseByte(unsigned char value)

所以你可以这样使用它:

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

答案 1 :(得分:2)

你的意思是我假设的按位否定。

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

请注意,我将参数更改为按值传递,而不是将指针传递给值。

我也不明白你为什么使用指针算法而不是索引。这只会让你的代码更难阅读。循环应该写成这样:

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

答案 2 :(得分: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);
}

答案 3 :(得分:1)

从评论中可以清楚地看出,反转字节(即从前到后重新排序)而非反转(即从其最大值中减去变量)或者否定(即翻转1和0),所以应该相应地命名函数。

这是来自Seander's bithacks的neat little snippet

   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的答案与这个结合起来,你应该把所有的东西放在一起来组合你的功能。