C# 如何在C中指定字节[]作为指针# 我有一个函数,它根据任何包的内容生成CRC校验字节。问题是把函数从C++翻译成C<< /P>
C++代码:C# 如何在C中指定字节[]作为指针# 我有一个函数,它根据任何包的内容生成CRC校验字节。问题是把函数从C++翻译成C<< /P>,c#,pointers,byte,C#,Pointers,Byte,C++代码: unsigned char GenerateCheckByte( char* packet, int length, unsigned long seed ) { if( !packet ) return 0; unsigned long checksum = 0xFFFFFFFF; length &= 0x7FFF; char* ptr = packet; unsigned long moddedseed = seed << 8; for( int i = 0
unsigned char GenerateCheckByte( char* packet, int length, unsigned long seed )
{
if( !packet ) return 0;
unsigned long checksum = 0xFFFFFFFF;
length &= 0x7FFF;
char* ptr = packet;
unsigned long moddedseed = seed << 8;
for( int i = 0; i < length; i++ )
checksum = ( checksum >> 8 ) ^ table[moddedseed + ( ( *(ptr++) ^ checksum ) & 0xFF )];
unsigned char result = ( (checksum>>24)&0xFF ) + ( (checksum>>8)&0xFF ) + ( (checksum>>16)&0xFF ) + ( checksum&0xFF );
return result;
}
错误:“只能在固定语句初始值设定项中获取未固定表达式的地址”
请注意
PATETBASH在C++和C应用程序中都是字节[] PATETBase=新字节[18 ]; 您可以使该方法接受字节数组:
public static unsafe byte GenerateCheckByte(byte[] packetArray, int length, UInt32 seed)
{
fixed(byte *packet = packetArray)
{
... etc
}
}
最好将不安全的东西尽可能隐藏在托管接口后面
那么打电话就很容易了:
packetBuffer[5] = Functions.GenerateCheckByte(packetBuffer, 18, ...
事实上,最好还是编写GenerateCheckByte
来操作数组,而不是钻研不安全的技术:
public static unsafe byte GenerateCheckByte(byte[] packet, int length, UInt32 seed )
{
if (packet == null)
throw new ArgumentNullException("packet"); // the right way in C#
UInt32 checksum = 0xFFFFFFFF;
length &= 0x7FFF;
UInt32 moddedseed = seed << 8;
for (int i = 0; i < length; i++)
checksum = ( checksum >> 8 ) ^ Table.table[moddedseed + ( ( packet[i] ^ checksum ) & 0xFF )];
byte result = (byte)(( (checksum>>24)&0xFF ) + ( (checksum>>8)&0xFF ) + ( (checksum>>16)&0xFF ) + ( checksum&0xFF ));
return result;
}
public静态不安全字节生成器checkbyte(字节[]数据包,int长度,UInt32种子)
{
if(数据包==null)
抛出新ArgumentNullException(“packet”);//在C中使用正确的方法#
UInt32校验和=0xFFFFFF;
长度&=0x7FFF;
UInt32 moddedseed=seed>8)Table.Table[moddedseed+((数据包[i]^校验和)&0xFF)];
字节结果=(字节)((校验和>>24)&0xFF)+(校验和>>8)&0xFF)+(校验和>>16)&0xFF)+(校验和&0xFF));
返回结果;
}
尽可能编写最简单、最安全的实现,并且只有在分析过程中发现瓶颈时才能处理指针
您是否只是将大量现有的C/C++转换为C#?除非您从中获得了一些新的安全性/可维护性,否则这样做没有什么意义。:) 您需要将字节数组“固定”到内存中,以将其用作字节*
byte checksum;
fixed(byte* pPacketBuffer = packetBuffer)
{
checksum = Functions.GenerateCheckByte(pPacketBuffer, 18, packet.seedCRC)
}
packetBuffer[5] = checksum
参考资料:
您根本不应该使用不安全的代码。如果向函数发送字节数组,它可以不使用指针访问它
我还没有测试代码,但应该是这样的:
byte GenerateCheckByte(byte[] packet, ulong seed) {
if (packet == null) return 0;
int length = packet.Length & 0x7FFF;
ulong checksum = 0xFFFFFFFF;
ulong moddedseed = seed << 8;
for (int i = 0; i < length; i++) {
checksum = (checksum >> 8) ^ table[moddedseed + ((packet[i] ^ checksum) & 0xFF)];
}
return (byte)(
((checksum >> 24) & 0xFF) +
((checksum >> 16) & 0xFF) +
((checksum >> 8) & 0xFF) +
(checksum & 0xFF)
);
}
byte GenerateCheckByte(byte[]数据包,ulong seed){
if(packet==null)返回0;
int length=packet.length&0x7FFF;
ulong校验和=0xFFFFFF;
ulong moddedseed=seed>8)^表[moddedseed+((数据包[i]^校验和)&0xFF)];
}
返回(字节)(
((校验和>>24)和0xFF)+
((校验和>>16)和0xFF)+
((校验和>>8)和0xFF)+
(校验和&0xFF)
);
}
byte checksum;
fixed(byte* pPacketBuffer = packetBuffer)
{
checksum = Functions.GenerateCheckByte(pPacketBuffer, 18, packet.seedCRC)
}
packetBuffer[5] = checksum
byte GenerateCheckByte(byte[] packet, ulong seed) {
if (packet == null) return 0;
int length = packet.Length & 0x7FFF;
ulong checksum = 0xFFFFFFFF;
ulong moddedseed = seed << 8;
for (int i = 0; i < length; i++) {
checksum = (checksum >> 8) ^ table[moddedseed + ((packet[i] ^ checksum) & 0xFF)];
}
return (byte)(
((checksum >> 24) & 0xFF) +
((checksum >> 16) & 0xFF) +
((checksum >> 8) & 0xFF) +
(checksum & 0xFF)
);
}