1

下面显示的代码是 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

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
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 回答
1

从评论中可以清楚地看出,您正在反转字节(即从前到后重新排序)而不是反转(即从最大值中减去变量)或取反(即翻转 1 和 0),因此应该相应地命名函数。

这是Seander 的 bithacks 中的一个简洁的小片段:

   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 回答