/// <summary> /// Write the given field with the given writer, using the WMA-like format /// </summary> /// <param name="w">Write to write the fields to</param> /// <param name="fieldName">Field name</param> /// <param name="fieldValue">Field value</param> /// <param name="isNumeric">True if the field is numeric; false if not (will be formatted as string)</param> public static void WriteField(BinaryWriter w, string fieldName, string fieldValue, bool isNumeric) { long frameSizePos, midSizePos, finalFramePos; frameSizePos = w.BaseStream.Position; w.Write(0); // To be rewritten at the end of the method w.Write(StreamUtils.EncodeBEInt32(fieldName.Length)); w.Write(Utils.Latin1Encoding.GetBytes(fieldName)); w.Write((ushort)0); // Frame class ? w.Write(StreamUtils.EncodeBEInt16(1)); // ? (always 1) midSizePos = w.BaseStream.Position; w.Write(0); // To be rewritten at the end of the method if (isNumeric) { w.Write(StreamUtils.EncodeBEInt16(19)); // ?? (works for rating) w.Write(long.Parse(fieldValue)); // 64-bit little-endian integer ? } else { w.Write(StreamUtils.EncodeBEInt16(8)); // ?? (always 8) w.Write(Encoding.Unicode.GetBytes(fieldValue + '\0')); // String is null-terminated } finalFramePos = w.BaseStream.Position; // Go back to frame size locations to write their actual size w.BaseStream.Seek(midSizePos, SeekOrigin.Begin); w.Write(StreamUtils.EncodeBEInt32((int)(finalFramePos - midSizePos))); w.BaseStream.Seek(frameSizePos, SeekOrigin.Begin); w.Write(StreamUtils.EncodeBEInt32((int)(finalFramePos - frameSizePos))); w.BaseStream.Seek(finalFramePos, SeekOrigin.Begin); }
public void StreamUtils_BEInt16Converters() { short intValue = 0x3529; Assert.AreEqual((short)0x00FF, StreamUtils.DecodeBEInt16(new byte[2] { 0x00, 0xFF })); byte[] byteValue = StreamUtils.EncodeBEInt16(intValue); Assert.AreEqual(intValue, StreamUtils.DecodeBEInt16(byteValue)); }
private void writeCommentChunk(BinaryWriter w, MetaFieldInfo info, string comment = "") { byte[] commentData = null; if (null == info) // Plain string { w.Write(StreamUtils.EncodeBEUInt32(encodeTimestamp(DateTime.Now))); w.Write((short)0); commentData = Utils.Latin1Encoding.GetBytes(comment); } else { w.Write(StreamUtils.EncodeBEUInt32(((CommentData)info.SpecificData).Timestamp)); w.Write(StreamUtils.EncodeBEInt16(((CommentData)info.SpecificData).MarkerId)); commentData = Utils.Latin1Encoding.GetBytes(info.Value); } w.Write(StreamUtils.EncodeBEUInt16((ushort)commentData.Length)); w.Write(commentData); }