C++代码转C#的函数转换

.Net技术 码拜 8年前 (2016-09-13) 2255次浏览
要把encryptBuffer这个c++的转成C#,下面是本人本人写的,好像写的不对

byte* encryptBuffer(byte* data, int dataSize)
{
	int checkCode = 0;
	int i=4;
    
	for (; i < dataSize; i++) {
		if ( data[i] < 0) {
			checkCode += (256 +  data[i]);
			data[i] = mapsendvbyte(256 +  data[i]);
		} else {
			checkCode +=  data[i];
			data[i] = mapsendvbyte(data[i]);
		}
        
		checkCode %= 256;
	}
	data[0] |= DATA_MAPPED;
	data[1] = (byte) (~checkCode + 1);
    
	return data;
}

这个是本人本人改写的,不知道对不对

 private void EncryptBuffer()
    {
        int checkCode = 0;
        int i = 4;
        for (; i < m_Value.Count; i++)
        {
            
            sbyte tmpSbyte = (sbyte) m_Value[i];
            if (m_Value[i] > 127)
                tmpSbyte = (sbyte)( m_Value[i] - 256);
            if (tmpSbyte < 0)
            {
                checkCode += (256 + tmpSbyte);
                m_Value[i] = mapsendvbyte((byte)(256 + (int)tmpSbyte));
            }
            else
            {
                checkCode += tmpSbyte;
                m_Value[i] = mapsendvbyte((byte)tmpSbyte);
            }
            checkCode %= 256;
        }
        m_Value[0] |= DATA_MAPPED;
        m_Value[1] = (byte) (~checkCode + 1);
    }

mapsendvbyte的C#版本,转自C++版本

 static byte mapsendvbyte(byte data)
    {
        int len = data;
        if (len >= 256)
        {
            len = len % 256;
        }
        byte cbMap;
        cbMap = m_SendByteMap[len];
        return cbMap;
    }
static byte mapsendvbyte(byte data){
	int len = data;
	if (len >= 256) {
		len = len % 256;
	}
	byte cbMap;
	cbMap = m_SendByteMap[len];
	return cbMap;
}

m_SendByteMap是一个256大小的byte数组
byte m_SendByteMap[] = {
0x70,0x2F,0x40,0x5F,0x44,0x8E,0x6E,0x45,0x7E,0xAB,0x2C,0x1F,0xB4,0xAC,0x9D,0x91,
0x0D,0x36,0x9B,0x0B,……..}
还有C++string是这样打包的C++代码转C#的函数转换
那么本人应该怎么样打包C#的string?

解决方案

30

lz代码中的C++类型byte是什么类型?假如是rpcndr.h中定义的type,那么对应的应该是unsigned char类型,此类怎么可能小于0或大于256……
由于unsigned char个与C#中的byte是同一类型,因此代码都基本不用修改:

byte* encryptBuffer(byte* data, int dataSize)
{
    int i,checkCode = 0;
     
    for (i=4; i < dataSize; i++) {
        checkCode+=data[i];
        data[i]=mapsendvbyte(data[i]);
        checkCode %= 256;
    }
 
    data[0] |= DATA_MAPPED;
    data[1] = (byte) (~checkCode + 1);
     
    return data;
}
void encryptBuffer(byte[] data)
{
    int checkCode = 0;
     
    for (int i=4; i < data.length; i++) {
        checkCode+=data[i];
        data[i]=mapsendvbyte(data[i]);
        checkCode %= 256;
    }
 
    data[0] |= DATA_MAPPED;
    data[1] = (byte) (~checkCode + 1);
     
    return data;
}

mapsendvbyte函数在C++和C#中一样

static byte mapsendvbyte(byte data)
{
    return(m_SendByteMap[data]);
}

30

字符串打包直接用
Encoding.UTF8.GetBytes(string s, int charIndex, int charCount, byte[] bytes, int byteIndex)

30

嗯,就这样加

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C++代码转C#的函数转换
喜欢 (0)
[1034331897@qq.com]
分享 (0)