SharpOSC.OscMessage.GetBytes C# (CSharp) Method

GetBytes() public method

public GetBytes ( ) : byte[]
return byte[]
        public override byte[] GetBytes()
        {
            List<byte[]> parts = new List<byte[]>();

            List<object> currentList = Arguments;
            int ArgumentsIndex = 0;

            string typeString = ",";
            int i = 0;
            while (i < currentList.Count)
            {
                var arg = currentList[i];

                string type = (arg != null) ? arg.GetType().ToString() : "null";
                switch (type)
                {
                    case "System.Int32":
                        typeString += "i";
                        parts.Add(setInt((int)arg));
                        break;
                    case "System.Single":
                        if (float.IsPositiveInfinity((float)arg))
                        {
                            typeString += "I";
                        }
                        else
                        {
                            typeString += "f";
                            parts.Add(setFloat((float)arg));
                        }
                        break;
                    case "System.String":
                        typeString += "s";
                        parts.Add(setString((string)arg));
                        break;
                    case "System.Byte[]":
                        typeString += "b";
                        parts.Add(setBlob((byte[])arg));
                        break;
                    case "System.Int64":
                        typeString += "h";
                        parts.Add(setLong((Int64)arg));
                        break;
                    case "System.UInt64":
                        typeString += "t";
                        parts.Add(setULong((UInt64)arg));
                        break;
                    case "SharpOSC.Timetag":
                        typeString += "t";
                        parts.Add(setULong(((Timetag)arg).Tag));
                        break;
                    case "System.Double":
                        if (Double.IsPositiveInfinity((double)arg))
                        {
                            typeString += "I";
                        }
                        else
                        {
                            typeString += "d";
                            parts.Add(setDouble((double)arg));
                        }
                        break;

                    case "SharpOSC.Symbol":
                        typeString += "S";
                        parts.Add(setString(((Symbol)arg).Value));
                        break;

                    case "System.Char":
                        typeString += "c";
                        parts.Add(setChar((char)arg));
                        break;
                    case "SharpOSC.RGBA":
                        typeString += "r";
                        parts.Add(setRGBA((RGBA)arg));
                        break;
                    case "SharpOSC.Midi":
                        typeString += "m";
                        parts.Add(setMidi((Midi)arg));
                        break;
                    case "System.Boolean":
                        typeString += ((bool)arg) ? "T" : "F";
                        break;
                    case "null":
                        typeString += "N";
                        break;

                    // This part handles arrays. It points currentList to the array and resets i
                    // The array is processed like normal and when it is finished we replace
                    // currentList back with Arguments and continue from where we left off
                    case "System.Object[]":
                    case "System.Collections.Generic.List`1[System.Object]":
                        if(arg.GetType() == typeof(object[]))
                            arg = ((object[])arg).ToList();

                        if (Arguments != currentList)
                            throw new Exception("Nested Arrays are not supported");
                        typeString += "[";
                        currentList = (List<object>)arg;
                        ArgumentsIndex = i;
                        i = 0;
                        continue;

                    default:
                        throw new Exception("Unable to transmit values of type " + type);
                }

                i++;
                if (currentList != Arguments && i == currentList.Count)
                {
                    // End of array, go back to main Argument list
                    typeString += "]";
                    currentList = Arguments;
                    i = ArgumentsIndex+1;
                }
            }

            int addressLen = (Address.Length == 0 || Address == null ) ? 0 : Utils.AlignedStringLength(Address);
            int typeLen = Utils.AlignedStringLength(typeString);

            int total = addressLen + typeLen + parts.Sum(x => x.Length);

            byte[] output = new byte[total];
            i = 0;

            Encoding.ASCII.GetBytes(Address).CopyTo(output, i);
            i += addressLen;

            Encoding.ASCII.GetBytes(typeString).CopyTo(output, i);
            i += typeLen;

            foreach (byte[] part in parts)
            {
                part.CopyTo(output, i);
                i += part.Length;
            }

            return output;
        }