要把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
嗯,就这样加