Esempio n. 1
0
    public static byte[] pack(Message vo, ByteArray result, int alias = 0)
    {
        string[][] attrs = vo.getAttributes();
        int lenT = attrs.Length;
        int len = 0;
        int i = 0;
        int j = 0;
        string type;
        object voValue;
        if (lenT > 255)
        {
            result.writeByte(105);
            result.writeInt(lenT + 1);
        }
        else
        {
            result.writeByte(104);
            result.writeByte((byte)(lenT + 1));
        }
        if (alias > 0)
        {
            result.writeByte(98);
            result.writeInt(alias);
        }
        else
        {
            result.writeByte(100);
            result.writeUTF(vo.getClassName());
        }

        for (i = 0; i < lenT; i++)
        {

            type = attrs[i][1].ToString().ToLower();
            voValue = vo.getValue(attrs[i][0]);
            if (type == "int")
            {
                result.writeByte(98);
                result.writeInt((int)voValue);
            }
            else if (type == "double" || type == "number")
            {
                if ((double)voValue < 2147483647 && (double)voValue > -2147483647)
                {
                    result.writeByte(98);
                    int small = (int)((double)voValue);
                    result.writeInt(small);
                }
                else
                {
                    result.writeByte(110);
                    ByteArray bigB = new ByteArray();
                    float big = (float)voValue;
                    while (big > 1)
                    {
                        bigB.writeByte(Convert.ToByte((int)big & 0xFF));
                        big = big / 256;
                    }
                    result.writeByte(Convert.ToByte(bigB.Length));
                    if ((int)voValue > 0)
                    {
                        result.writeByte(0);
                    }
                    else
                    {
                        result.writeByte(1);
                    }
                    for (int bigL = 0; bigL <= bigB.Length - 1; bigL++)
                    {
                        result.writeByte(bigB.Buffer[bigL]);
                    }
                }
            }
            else if (type == "String" || type == "string")
            {
                result.writeByte(107);
                result.writeUTF((string)voValue);
            }
            else if (type == "bool" || type == "boolean")
            {
                result.writeByte(100);
                if ((bool)voValue)
                {
                    result.writeUTF("true");
                }
                else
                {
                    result.writeUTF("false");
                }
            }
            else if (type == "array")
            {
                if ((object[])voValue != null)
                {
                    len = ((object[])voValue).Length;
                    if (len > 0)
                    {
                        result.writeByte(108);
                        result.writeUnsignedInt((uint)len);
                        string subType = (string)attrs[i][2].ToLower();
                        for (j = 0; j < len; j++)
                        {
                            if (subType == "int")
                            {
                                result.writeByte(98); // 不做优化
                                result.writeInt((int)((object[])voValue)[j]);
                            }
                            else if (subType == "double" || subType == "number")
                            {
                                result.writeByte(110);
                                ByteArray bigB2 = new ByteArray();
                                uint big2 = (uint)((object[])voValue)[j];
                                while (big2 > 1)
                                {
                                    bigB2.writeByte(Convert.ToByte((int)big2 & 0xFF));
                                    big2 = big2 / 256;
                                }
                                result.writeByte(Convert.ToByte(bigB2.Length));
                                if ((int)((object[])voValue)[j] > 0)
                                {
                                    result.writeByte(0);
                                }
                                else
                                {
                                    result.writeByte(1);
                                }
                                for (int bigL2 = 0; bigL2 < bigB2.Length; bigL2++)
                                {
                                    result.writeByte(bigB2.Buffer[bigL2]);
                                }
                            }
                            else if (subType == "String" || type == "string")
                            {
                                result.writeByte(107);
                                result.writeUTF((string)((object[])voValue)[j]);
                            }
                            else if (subType == "bool" || subType == "Boolean")
                            {
                                result.writeByte(100);
                                if ((bool)((object[])voValue)[j])
                                {
                                    result.writeUTF("true");
                                }
                                else
                                {
                                    result.writeUTF("false");
                                }
                            }
                            else
                            {
                                pack((Message)((object[])voValue)[j], result);
                            }
                        }
                    }
                }
                result.writeByte(106);
            }
            else if (type == "bytes")
            {
                result.writeByte(109);
                byte[] tttByte = voValue as byte[];
                result.writeInt(tttByte.Length);
                result.writeBytes(tttByte, 0, tttByte.Length);
            }
            else
            {
                pack((Message)voValue, result);
            }
        }
        return result.Buffer;
    }
Esempio n. 2
0
 private static void decodeVO(ByteArray input, Message vo)
 {
     string[][] arr = vo.getAttributes();
     int lenT = arr.Length;
     uint flag = 0;
     int len = 0;
     int i = 0;
     int j = 0;
     string type;
     object voValue;
     for (j = 0; j < lenT; j++)
     {
         string[] arr2 = arr[j];
         flag = input.readUnsignedByte();
         switch (flag)
         {
             case 97: // small int
                 vo.setValue(arr2[0], input.readUnsignedByte());
                 break;
             case 98: // int
                 vo.setValue(arr2[0], input.readInt());
                 break;
             case 99: // string format float
                 byte[] tmp = new byte[31];
                 input.readBytes(tmp, 0, 31);
                 vo.setValue(arr2[0], tmp.ToString());
                 break;
             case 115: //string
                 len = (int)input.readUnsignedByte();
                 if (len > 0)
                 {
                     ByteArray t = new ByteArray();
                     t.readBytes(input.Buffer, (uint)input.Postion, (uint)len);
                     vo.setValue(arr2[0], t.ToString());
                 }
                 break;
             case 107: //Array
                 len = (int)input.readUnsignedShort();
                 if (len > 0)
                 {
                     if (arr2[1] == "String" || arr2[1] == "string")
                     {
                         vo.setValue(arr2[0], input.readUTFBytes((uint)len));
                     }
                     else
                     {
                         int[] tmpArray4 = new int[len];
                         for (i = 0; i < len; i++)
                         {
                             tmpArray4[i] = input.readUnsignedByte();
                         }
                         vo.setValue(arr2[0], tmpArray4);
                     }
                 }
                 break;
             case 108: //Array
                 len = (int)input.readUnsignedInt();
                 if (len > 0)
                 {
                     object[] tmpArray3 = new object[len];
                     Message[] tmpArrPP = new Message[len];
                     bool isPP = (string)(arr2[2]).Substring(0, 2) == "p_";
                     for (i = 0; i < len; i++)
                     {
                         if (isPP == false)
                         {
                             tmpArray3[i] = decodeOther(input, arr2[1], arr2[2]);
                         }
                         else
                         {
                             input.readUnsignedByte();
                             input.readUnsignedByte();
                             input.readUnsignedByte();
                             string voName = "proto" + "." + input.readUTF();
                             Message subVO = Type.GetType(voName).Assembly.CreateInstance(voName) as Message;
                             decodeVO(input, subVO);
                             tmpArrPP[i] = subVO;
                         }
                     }
                     input.readByte();
                     if (isPP == false)
                     {
                         vo.setValue(arr2[0], tmpArray3);
                     }else{
                         vo.setValue(arr2[0], tmpArrPP);
                     }
                 }
                 break;
             case 106: // nil
                 if (arr2[1] == "String" || arr2[1] == "string")
                 {
                     vo.setValue(arr2[0], "");
                 }
                 else
                 {
                     object[] list = new object[0];
                     vo.setValue(arr2[0], list);
                 }
                 break;
             case 104: // small tuple
                 len = (int)input.readUnsignedByte();
                 //input.readUnsignedByte();
                 if (len > 0)
                 {
                     input.readUnsignedByte();
                     string voName2 = "proto" + "." + input.readUTF();
                     Message subVO2 = Type.GetType(voName2).Assembly.CreateInstance(voName2) as Message;
                     decodeVO(input, subVO2);
                     vo.setValue(arr2[0], subVO2);
                 }
                 break;
             case 105: // large tuple
                 input.readUnsignedByte();
                 len = (int)input.readUnsignedInt();
                 if (len > 0)
                 {
                     string voName3 = "proto" + "." + input.readUTF();
                     Type voClass3 = Type.GetType(voName3);
                     Message subVO3 = voClass3.Assembly.CreateInstance(voName3) as Message;
                     decodeVO(input, subVO3);
                     vo.setValue(arr2[0], subVO3);
                 }
                 break;
             case 100: // atom 当做字符串对待
                 string s = input.readUTF();
                 if (arr2[1] == "Boolean" || arr2[1] == "bool")
                 {
                     vo.setValue(arr2[0], s == "true");
                 }
                 else
                 {
                     if (s == "undefined")
                     {
                         vo.setValue(arr2[0], null);
                     }
                     else
                     {
                         vo.setValue(arr2[0], s);
                     }
                 }
                 break;
             case 110: // small bignums
                 len = (int)input.readUnsignedByte();
                 uint f = input.readUnsignedByte(); // 0 整数 1 负数
                 double r = 0;
                 uint temp2 = 0;
                 for (i = 0; i < len; i++)
                 {
                     temp2 = input.readUnsignedByte();
                     r += temp2 * Math.Pow(256, i);
                 }
                 if (f == 1)
                 {
                     r = -r;
                 }
                 vo.setValue(arr2[0], r);
                 break;
             case 111: // large bignums
                 len = (int)input.readUnsignedByte();
                 uint f2 = input.readUnsignedByte(); // 0 整数 1 负数
                 double r2 = 0;
                 uint temp4 = 0;
                 for (i = 0; i < len; i++)
                 {
                     temp4 = input.readUnsignedByte();
                     r2 += temp4 * Math.Pow(256, i);
                 }
                 if (f2 == 1)
                 {
                     r2 = -r2;
                 }
                 vo.setValue(arr2[0], r2);
                 break;
             case 109:
                 len = input.readInt();
                 if (arr2[1] == "String" || arr2[1] == "string")
                 {
                     vo.setValue(arr2[0], input.readUTFBytes((uint)len));
                 }
                 else
                 {
                     byte[] t2 = new byte[len];
                     if (len > 0)
                     {
                         input.readBytes(t2, 0, (uint)len);
                     }
                     vo.setValue(arr2[0], t2);
                 }
                 break;
             default: // 其他类型统统不支持!!!
                 //throw new Error("未知类型:", flag);
                 break;
         }
     }
 }