public static int Encode_Application_Character_String(ref Byte[] apdu, ref BACNET_CHARACTER_STRING character_string, int pos)
        {
            int len        = 0;
            int string_len = 0;

            string_len =
                (int)character_string.size + 1 /* for encoding */;
            len += Encode_Tag(ref apdu, (Byte)BACNET_APPLICATION_TAG.BACNET_APPLICATION_TAG_CHARACTER_STRING, false, (UInt32)string_len, pos + len);
            len += Encode_Character_String(ref apdu, ref character_string, pos + len);

            return(len);
        }
        public static int Encode_Character_String(ref Byte[] apdu, ref BACNET_CHARACTER_STRING char_string, int pos)
        {
            UInt32 apdu_len = 1 /*encoding */;
            UInt32 i;

            apdu_len     += char_string.size;
            apdu[pos + 0] = char_string.encoding;
            for (i = 0; i < char_string.size; i++)
            {
                apdu[pos + 1 + i] = (Byte)char_string.value[i];
            }
            return((int)apdu_len);
        }
        public static int Decode_Context_Character_String(ref Byte[] apdu, Byte tag_number, ref BACNET_CHARACTER_STRING char_string, int pos)
        {
            int    len       = 0; /* return value */
            bool   status    = false;
            UInt32 len_value = 0;

            len += Decode_Tag_number_and_Value(ref apdu, ref tag_number, ref len_value, pos + len);
            char_string.init(ref apdu, apdu[pos + len], len_value, len + pos + 1);


            return(len);
        }
        public static int Encode_Context_Character_String(ref Byte[] apdu, Byte tag_number, ref BACNET_CHARACTER_STRING char_string, int pos)
        {
            int len        = 0;
            int string_len = 0;

            string_len = (int)char_string.size + 1;
            len       += Encode_Tag(ref apdu, tag_number, true, (uint)string_len, pos + len);
            len       += Encode_Character_String(ref apdu, ref char_string, pos + len);
            return(len);
        }