internal static unsafe byte[] GetBytes(string str, SerializerSession session, out int byteCount) { //if first byte is 0 = null //if first byte is 254 or less, then length is value - 1 //if first byte is 255 then the next 4 bytes are an int32 for length if (str == null) { byteCount = 1; return(new[] { (byte)0 }); } byteCount = Utf8.GetByteCount(str); if (byteCount < 254) //short string { var bytes = session.GetBuffer(byteCount + 1); Utf8.GetBytes(str, 0, str.Length, bytes, 1); bytes[0] = (byte)(byteCount + 1); byteCount += 1; return(bytes); } else //long string { var bytes = session.GetBuffer(byteCount + 1 + 4); Utf8.GetBytes(str, 0, str.Length, bytes, 1 + 4); bytes[0] = 255; fixed(byte *b = bytes) * (int *)(b + 1) = byteCount; byteCount += 1 + 4; return(bytes); } }
public static byte[] ReadLengthEncodedByteArray(this Stream self, SerializerSession session) { var length = self.ReadInt32(session); var buffer = session.GetBuffer(length); self.Read(buffer, 0, length); return buffer; }
public static int ReadInt32(this Stream self, SerializerSession session) { var buffer = session.GetBuffer(4); self.Read(buffer, 0, 4); var res = BitConverter.ToInt32(buffer, 0); return res; }
public static byte[] ReadLengthEncodedByteArray(this Stream self, SerializerSession session) { var length = self.ReadInt32(session); var buffer = session.GetBuffer(length); self.Read(buffer, 0, length); return(buffer); }
public static int ReadInt32(this Stream self, SerializerSession session) { var buffer = session.GetBuffer(4); self.Read(buffer, 0, 4); var res = BitConverter.ToInt32(buffer, 0); return(res); }