/// <summary> /// Write utf-8 string /// </summary> /// <param name="val">string</param> /// <param name="strPrefixByteLen">string prefix byte len</param> /// <param name="isWriteEndChar">is Write End Char</param> /// <param name="isPrefixContainEndCharByteLen">is Prefix Contain EndChar Byte Len</param> /// <returns>bool</returns> public bool WriteUTF8(string val, EStringPrefixLen strPrefixByteLen = EStringPrefixLen.Int32, bool isWriteEndChar = true, bool isPrefixContainEndCharByteLen = true) { if (!isWriteEndChar) { isPrefixContainEndCharByteLen = false; } byte[] buf = new byte[0]; if (!string.IsNullOrEmpty(val)) { buf = Encoding.UTF8.GetBytes(val); } int prefixVal = buf.Length; if (isWriteEndChar && isPrefixContainEndCharByteLen) { prefixVal += 1; } int len = (int)strPrefixByteLen + buf.Length; if (isWriteEndChar) { len += 1; } if (ms.AvaliableWrite() >= len) { switch (strPrefixByteLen) { case EStringPrefixLen.Byte: WriteByte((byte)prefixVal); break; case EStringPrefixLen.Int16: WriteUInt16((UInt16)prefixVal); break; case EStringPrefixLen.Int32: WriteUInt32((UInt32)prefixVal); break; case EStringPrefixLen.Int64: WriteUInt64((UInt64)prefixVal); break; } ms.Write(buf, 0, buf.Length); if (isWriteEndChar) { WriteByte(0); } return(true); } return(false); }
/// <summary> /// Get String Byte Count /// </summary> /// <param name="str">str</param> /// <param name="encode">encode</param> /// <param name="prefix">prefix</param> /// <param name="hasEndChar">has EndChar</param> /// <returns></returns> public static int GetStringByteCount(string str, Encoding encode, EStringPrefixLen prefix = EStringPrefixLen.Int32, bool hasEndChar = true) { int count = (int)prefix; if (!string.IsNullOrEmpty(str)) { count += encode.GetByteCount(str); } if (hasEndChar) { count += GetStringEndCharByteLength(encode); } return(count); }
/// <summary> /// Read UTF-8 string /// </summary> /// <param name="strPrefixByteLen">string prefix byte len</param> /// <param name="hasEndChar">has EndChar</param> /// <param name="isPrefixContainEndCharByteLen">is Prefix Contain EndChar Byte Len</param> /// <returns>string</returns> public string ReadUTF8Prefix(EStringPrefixLen strPrefixByteLen = EStringPrefixLen.Int32, bool hasEndChar = true, bool isPrefixContainEndCharByteLen = true) { string result = ""; if (!hasEndChar) { isPrefixContainEndCharByteLen = false; } int len = 0; switch (strPrefixByteLen) { case EStringPrefixLen.Byte: len = ReadByte(); break; case EStringPrefixLen.Int16: len = ReadUInt16(); break; case EStringPrefixLen.Int32: len = (int)ReadUInt32(); break; case EStringPrefixLen.Int64: len = (int)ReadUInt64(); break; } if (hasEndChar && !isPrefixContainEndCharByteLen) { len += 1; } if (ms.AvaliableRead() >= len) { result = ReadUTF8(len); } return(result); }
/// <summary> /// Get String Byte Count /// </summary> /// <param name="str">str</param> /// <param name="prefix">prefix</param> /// <param name="hasEndChar">has EndChar</param> /// <returns></returns> public static int GetStringByteCount(string str, EStringPrefixLen prefix = EStringPrefixLen.Int32, bool hasEndChar = true) { return(GetStringByteCount(str, Encoding.UTF8, prefix, hasEndChar)); }