要把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#的string?
解决方案
30
lz代码中的C++类型byte是什么类型?假如是rpcndr.h中定义的type,那么对应的应该是unsigned char类型,此类怎么可能小于0或大于256……
由于unsigned char个与C#中的byte是同一类型,因此代码都基本不用修改:
由于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)
Encoding.UTF8.GetBytes(string s, int charIndex, int charCount, byte[] bytes, int byteIndex)
30
嗯,就这样加