Esempio n. 1
0
        public int ExtractMutableSendDatas(CruMessage msg, byte[] buffer, int offset)
        {
            /*
             * 일반적으로 가변데이터 형식은 똑같다.
             * type + data갯수 + (data 정보들) + (data 정보들) + ...
             */
            byte[] temp;
            short  type = msg.Type;

            object[] datas         = msg.Datas;
            int      headSize      = 0;
            int      dataCnt       = datas.Length;
            int      dataSize      = 0;
            int      totalDataSize = 0;

            int[] datasizelist;
            CruNetworkProtocol.DATA_TYPE[] typelist;

            headSize     = CruNetworkProtocol.Head.HEADSIZE_TYPE;
            datasizelist = CruNetworkProtocol.GetMessageSizeList(type);
            typelist     = CruNetworkProtocol.GetMessageTypeList(type);

            // type 처리
            temp = BitConverter.GetBytes(type);
            Array.Copy(temp, 0, buffer, offset + dataSize, headSize);
            dataSize += headSize;

            // data count 처리
            temp = BitConverter.GetBytes((short)datas[0]);
            Array.Copy(temp, 0, buffer, offset + dataSize, datasizelist[1]);
            dataSize += datasizelist[1];

            // data 처리
            for (int i = 1; i < dataCnt; ++i)
            {
                for (int j = 2; j < datasizelist.Length; ++j)
                {
                    // 버퍼 사이즈 넘어가는지 체크
                    if (offset + dataSize + datasizelist[j] > buffer.Length)
                    {
                        throw new SystemException("버퍼 사이즈를 넘어갑니다.");
                    }

                    switch (typelist[j])
                    {
                    case CruNetworkProtocol.DATA_TYPE.BOOLEAN:
                        temp = BitConverter.GetBytes((bool)datas[i]);
                        break;

                    case CruNetworkProtocol.DATA_TYPE.SHORT:
                        temp = BitConverter.GetBytes((short)datas[i]);
                        break;

                    case CruNetworkProtocol.DATA_TYPE.INT:
                        temp = BitConverter.GetBytes((int)datas[i]);
                        break;

                    case CruNetworkProtocol.DATA_TYPE.FLOAT:
                        temp = BitConverter.GetBytes((float)datas[i]);
                        break;

                    case CruNetworkProtocol.DATA_TYPE.DOUBLE:
                        temp = BitConverter.GetBytes((double)datas[i]);
                        break;

                    case CruNetworkProtocol.DATA_TYPE.STRING:
                    {
                        short stringsize;
                        temp = new byte[datasizelist[j]];

                        if ((string)datas[i] == null)
                        {
                            stringsize = 0;
                        }
                        else
                        {
                            stringsize = (short)((string)datas[i]).Length;
                        }

                        // Set string size
                        Array.Copy(BitConverter.GetBytes(stringsize), temp, CruNetworkProtocol.Head.HEADSIZE_STRING);

                        // Set string data
                        if (datas[i] != null)
                        {
                            Encoding.ASCII.GetBytes((string)datas[i], 0, ((string)datas[i]).Length, temp, CruNetworkProtocol.Head.HEADSIZE_STRING);
                        }
                    }
                    break;

                    default:
                        break;
                    }

                    Array.Copy(temp, 0, buffer, offset + dataSize, datasizelist[j]);
                    dataSize += datasizelist[j];
                }
            }

            // 총 데이터 사이즈 = 헤드사이즈 + 데이터묶음 수 사이즈 + ((데이터 묶음 사이즈) * 데이터 묶음 수)
            totalDataSize = headSize + datasizelist[1] + ((datasizelist[0] - datasizelist[1]) * (short)datas[0]);

            if (dataSize != totalDataSize)
            {
                return(0);
            }

            return(dataSize);
        }
Esempio n. 2
0
        // CruMessage를 만드는 곳
        public CruMessage ExtractDatas(short type, byte[] buffer, int offset, int totalmsgssize)
        {
            CruMessage result;

            object[] datas;
            int[]    datasizelist;
            CruNetworkProtocol.DATA_TYPE[] typelist;
            int bufferIdx   = 0;
            int setDataSize = 0;

            datasizelist = CruNetworkProtocol.GetMessageSizeList(type);
            typelist     = CruNetworkProtocol.GetMessageTypeList(type);

            datas = new object[datasizelist.Length - 1];

            for (int i = 1; i < datasizelist.Length; ++i)
            {
                // 실제 버퍼 입력받을 위치
                bufferIdx = offset + setDataSize;

                // 다음에 처리할 사이즈가 총 버퍼의 사이즈를 넘어간다면,
                if (bufferIdx + datasizelist[i] > totalmsgssize)
                {
                    throw new SystemException("버퍼 사이즈를 넘겼습니다.");
                }

                // 데이터 Get
                switch (typelist[i])
                {
                case CruNetworkProtocol.DATA_TYPE.BOOLEAN:
                    datas[i - 1] = BitConverter.ToBoolean(buffer, bufferIdx);
                    break;

                case CruNetworkProtocol.DATA_TYPE.SHORT:
                    datas[i - 1] = BitConverter.ToInt16(buffer, bufferIdx);
                    break;

                case CruNetworkProtocol.DATA_TYPE.INT:
                    datas[i - 1] = BitConverter.ToInt32(buffer, bufferIdx);
                    break;

                case CruNetworkProtocol.DATA_TYPE.FLOAT:
                    datas[i - 1] = BitConverter.ToSingle(buffer, bufferIdx);
                    break;

                case CruNetworkProtocol.DATA_TYPE.DOUBLE:
                    datas[i - 1] = BitConverter.ToDouble(buffer, bufferIdx);
                    break;

                case CruNetworkProtocol.DATA_TYPE.STRING:
                {
                    int stringsize = BitConverter.ToInt16(buffer, bufferIdx);
                    datas[i - 1] = Encoding.ASCII.GetString(buffer, bufferIdx + CruNetworkProtocol.Head.HEADSIZE_STRING, stringsize);
                }
                break;

                default:
                    break;
                }

                setDataSize += datasizelist[i];
            }

            // 변화한 데이터 사이즈가, 총량을 넘어갔을 때 ㅇㅇ
            if (setDataSize > datasizelist[0])
            {
                return(null);
            }

            result = new CruMessage(type, datas);

            return(result);
        }
Esempio n. 3
0
        public int ExtractSendDatas(CruMessage msg, byte[] buffer, int offset)
        {
            byte[] temp;
            short  type = msg.Type;

            object[] datas    = msg.Datas;
            int      headSize = 0;
            int      dataSize = 0;

            int[] datasizelist;
            CruNetworkProtocol.DATA_TYPE[] typelist;

            headSize     = CruNetworkProtocol.Head.HEADSIZE_TYPE;
            datasizelist = CruNetworkProtocol.GetMessageSizeList(type);
            typelist     = CruNetworkProtocol.GetMessageTypeList(type);

            temp = BitConverter.GetBytes(type);
            Array.Copy(temp, 0, buffer, offset + dataSize, headSize);
            dataSize += headSize;

            for (int i = 0; i < msg.Datas.Length; ++i)
            {
                // 버퍼 사이즈 넘어가는지 체크
                if (offset + dataSize + datasizelist[i + 1] > buffer.Length)
                {
                    throw new SystemException("버퍼 사이즈를 넘어갑니다.");
                }

                switch (typelist[i + 1])
                {
                case CruNetworkProtocol.DATA_TYPE.BOOLEAN:
                    temp = BitConverter.GetBytes((bool)datas[i]);
                    break;

                case CruNetworkProtocol.DATA_TYPE.SHORT:
                    temp = BitConverter.GetBytes((short)datas[i]);
                    break;

                case CruNetworkProtocol.DATA_TYPE.INT:
                    temp = BitConverter.GetBytes((int)datas[i]);
                    break;

                case CruNetworkProtocol.DATA_TYPE.FLOAT:
                    temp = BitConverter.GetBytes((float)datas[i]);
                    break;

                case CruNetworkProtocol.DATA_TYPE.DOUBLE:
                    temp = BitConverter.GetBytes((double)datas[i]);
                    break;

                case CruNetworkProtocol.DATA_TYPE.STRING:
                {
                    short stringsize;
                    temp = new byte[datasizelist[i + 1]];

                    if ((string)datas[i] == null)
                    {
                        stringsize = 0;
                    }
                    else
                    {
                        stringsize = (short)((string)datas[i]).Length;
                    }

                    // Set string size
                    Array.Copy(BitConverter.GetBytes(stringsize), temp, CruNetworkProtocol.Head.HEADSIZE_STRING);

                    // Set string data
                    if (datas[i] != null)
                    {
                        Encoding.ASCII.GetBytes((string)datas[i], 0, ((string)datas[i]).Length, temp, CruNetworkProtocol.Head.HEADSIZE_STRING);
                    }
                }
                break;

                default:
                    break;
                }

                Array.Copy(temp, 0, buffer, offset + dataSize, datasizelist[i + 1]);
                dataSize += datasizelist[i + 1];
            }

            if (dataSize != datasizelist[0] + headSize)
            {
                return(0);
            }

            return(dataSize);
        }