public static byte[] MaybeSwap(byte[] val, bool isbe) { if ((BitConverter.IsLittleEndian && isbe) || (!BitConverter.IsLittleEndian && !isbe)) { return(Utility.Swap(val)); } else { return(val); } }
private static void WriteHeader(BinaryWriter writer, int trackCount) { // number of track entries in the file writer.Write((byte)0x00); writer.Write(Utility.Swap((short)trackCount)); // unknown (0x010600) writer.Write((byte)0x01); writer.Write((byte)0x06); writer.Write((byte)0x00); // size of header (0x000012, 18 byte header) writer.Write((byte)0x00); writer.Write((byte)0x00); writer.Write((byte)0x12); // 9 bytes of 0 padding? writer.Write(new byte [9]); }
private static void WriteTrackEntry(BinaryWriter writer, Device device, Track track) { // size of entry writer.Write((byte)0x00); writer.Write(Utility.Swap((short)0x022e)); // unknown (0x5aa501) writer.Write((byte)0x5a); writer.Write((byte)0xa5); writer.Write((byte)0x01); // start time in 256ms increments (60 seconds = 0xea) writer.Write(new byte [3]); // unknown (always 0?) writer.Write(new byte [3]); // unknown, assoc. with start time writer.Write(new byte [3]); // stop time in 256ms increments (60 seconds = 0xea) writer.Write(new byte [3]); // unknown (always 0?) writer.Write(new byte [3]); // unknown, assoc. with stop time writer.Write(new byte [3]); // volume (-100 to 0 to 100) writer.Write((byte)0x00); writer.Write(Utility.Swap((short)0x0064)); // file type (0x01 = MP3, 0x02 = AAC, 0x04 = WAV) writer.Write(new byte [2]); switch (track.Record.Type) { case TrackRecordType.MP3: writer.Write((byte)0x01); break; case TrackRecordType.AAC: default: writer.Write((byte)0x02); break; } // unknown (0x000200) writer.Write((byte)0x00); writer.Write((byte)0x02); writer.Write((byte)0x00); // file name (UTF-16, record is 522 bytes) string file = track.FileName; if (file.StartsWith(device.VolumeInfo.MountPoint)) { file = file.Substring(device.VolumeInfo.MountPoint.Length); } byte [] filebytes = Encoding.Unicode.GetBytes(file); writer.Write(filebytes); writer.Write(new byte [522 - filebytes.Length]); // shuffle flag (0x00 to disable playback in shuffle mode) writer.Write((byte)0x01); // bookmark flag (0x00 to disable) writer.Write((byte)0x00); // unknown, always 0? writer.Write((byte)0x00); }
public override void Save(BinaryWriter writer) { byte[] childBytes; int childLen; int childPadding; switch (Type) { case PhotoDetailType.ThumbnailContainer: case PhotoDetailType.ImageContainer: SaveChild(ImageName, out childBytes, out childLen); break; case PhotoDetailType.FileName: childBytes = Encoding.Unicode.GetBytes(Value); childLen = 12 + childBytes.Length; break; case PhotoDetailType.String: childBytes = Encoding.UTF8.GetBytes(Value); childLen = 12 + childBytes.Length; break; default: throw new DatabaseWriteException("Unknown detail type: " + Type); } childPadding = 0; if (Type == PhotoDetailType.FileName || Type == PhotoDetailType.String) { childPadding = 4 - (16 + recordPadding + childLen) % 4; } WriteName(writer); writer.Write(16 + recordPadding); writer.Write(16 + recordPadding + childLen + childPadding); writer.Write((short)Type); if (BrokenChildPadding) { writer.Write(Utility.Swap((short)childPadding)); } else { writer.Write((short)childPadding); } WritePadding(writer); switch (Type) { case PhotoDetailType.ThumbnailContainer: case PhotoDetailType.ImageContainer: writer.Write(childBytes, 0, childLen); break; case PhotoDetailType.FileName: WriteString(writer, childBytes, childPadding, true); break; case PhotoDetailType.String: WriteString(writer, childBytes, childPadding, false); break; default: throw new DatabaseWriteException("Unknown detail type: " + Type); } }