Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中指定字节[]作为指针# 我有一个函数,它根据任何包的内容生成CRC校验字节。问题是把函数从C++翻译成C<< /P>_C#_Pointers_Byte - Fatal编程技术网

C# 如何在C中指定字节[]作为指针# 我有一个函数,它根据任何包的内容生成CRC校验字节。问题是把函数从C++翻译成C<< /P>

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

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; 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)
          );
      }