-Made the GUID for ImportVBM uniform with the other cases.
--Because there are way more bytes used to represent the other GUIDs than this one, I just appended -0000-0000-0000-000000000000 to this per zeromus' request. -Got rid of the hex part of the BytesToString function. We apparently have BizHawk.Util.BytesToHexString. -Converted BytesToString to r.ReadStringFixedAscii, an extension method. I've determined that extension methods are cool and that I should use them more often.
This commit is contained in:
parent
c9b5f9989a
commit
e7e8402af0
|
@ -492,6 +492,15 @@ namespace BizHawk
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Read bytes from a BinaryReader and translate them into the UTF-8 string they represent.
|
||||||
|
public static string ReadStringFixedAscii(this BinaryReader r, int bytes)
|
||||||
|
{
|
||||||
|
byte[] read = new byte[bytes];
|
||||||
|
for (int b = 0; b < bytes; b++)
|
||||||
|
read[b] = r.ReadByte();
|
||||||
|
return System.Text.Encoding.UTF8.GetString(read);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// conerts bytes to an uppercase string of hex numbers in upper case without any spacing or anything
|
/// conerts bytes to an uppercase string of hex numbers in upper case without any spacing or anything
|
||||||
/// //could be extension method
|
/// //could be extension method
|
||||||
|
|
|
@ -83,20 +83,6 @@ namespace BizHawk.MultiClient
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Read bytes from a BinaryReader and translate them into a string for either the hexidecimal representation of the
|
|
||||||
binary numbers or the UTF-8 string they represent.
|
|
||||||
*/
|
|
||||||
private static string BytesToString(BinaryReader r, int size, bool hexadecimal = false)
|
|
||||||
{
|
|
||||||
byte[] bytes = new byte[size];
|
|
||||||
for (int b = 0; b < size; b++)
|
|
||||||
bytes[b] = r.ReadByte();
|
|
||||||
if (hexadecimal)
|
|
||||||
return string.Concat(bytes.Select(b => string.Format("{0:x2}", b)));
|
|
||||||
return System.Text.Encoding.UTF8.GetString(bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Import a text-based movie format. This works for .FM2 and .MC2.
|
// Import a text-based movie format. This works for .FM2 and .MC2.
|
||||||
private static Movie ImportText(string path, out string errorMsg, out string warningMsg)
|
private static Movie ImportText(string path, out string errorMsg, out string warningMsg)
|
||||||
{
|
{
|
||||||
|
@ -302,7 +288,7 @@ namespace BizHawk.MultiClient
|
||||||
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
|
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
|
||||||
BinaryReader r = new BinaryReader(fs);
|
BinaryReader r = new BinaryReader(fs);
|
||||||
// 000 4-byte signature: 46 43 4D 1A "FCM\x1A"
|
// 000 4-byte signature: 46 43 4D 1A "FCM\x1A"
|
||||||
string signature = BytesToString(r, 4);
|
string signature = r.ReadStringFixedAscii(4);
|
||||||
if (signature != "FCM\x1A")
|
if (signature != "FCM\x1A")
|
||||||
{
|
{
|
||||||
errorMsg = "This is not a valid .FCM file.";
|
errorMsg = "This is not a valid .FCM file.";
|
||||||
|
@ -350,7 +336,7 @@ namespace BizHawk.MultiClient
|
||||||
*/
|
*/
|
||||||
m.Header.SetHeaderLine("PAL", pal.ToString());
|
m.Header.SetHeaderLine("PAL", pal.ToString());
|
||||||
bool movieSyncHackOn = ((flags & 16) != 0);
|
bool movieSyncHackOn = ((flags & 16) != 0);
|
||||||
m.Header.SetHeaderLine("SyncHack", movieSyncHackOn.ToString());
|
m.Header.Comments.Add("SyncHack " + movieSyncHackOn.ToString());
|
||||||
/*
|
/*
|
||||||
009 1-byte flags: reserved, set to 0
|
009 1-byte flags: reserved, set to 0
|
||||||
00A 1-byte flags: reserved, set to 0
|
00A 1-byte flags: reserved, set to 0
|
||||||
|
@ -374,8 +360,8 @@ namespace BizHawk.MultiClient
|
||||||
// 01C 4-byte little-endian unsigned int: offset to the controller data inside file
|
// 01C 4-byte little-endian unsigned int: offset to the controller data inside file
|
||||||
uint firstFrameOffset = r.ReadUInt32();
|
uint firstFrameOffset = r.ReadUInt32();
|
||||||
// 020 16-byte md5sum of the ROM used
|
// 020 16-byte md5sum of the ROM used
|
||||||
string MD5 = BytesToString(r, 16, true);
|
byte[] MD5 = r.ReadBytes(16);
|
||||||
m.Header.SetHeaderLine("MD5", MD5);
|
m.Header.SetHeaderLine("MD5", BizHawk.Util.BytesToHexString(MD5).ToLower());
|
||||||
// 030 4-byte little-endian unsigned int: version of the emulator used
|
// 030 4-byte little-endian unsigned int: version of the emulator used
|
||||||
uint emuVersion = r.ReadUInt32();
|
uint emuVersion = r.ReadUInt32();
|
||||||
m.Header.Comments.Add(EMULATIONORIGIN + " FCEU " + emuVersion.ToString());
|
m.Header.Comments.Add(EMULATIONORIGIN + " FCEU " + emuVersion.ToString());
|
||||||
|
@ -553,7 +539,7 @@ namespace BizHawk.MultiClient
|
||||||
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
|
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
|
||||||
BinaryReader r = new BinaryReader(fs);
|
BinaryReader r = new BinaryReader(fs);
|
||||||
// 000 4-byte signature: 46 4D 56 1A "FMV\x1A"
|
// 000 4-byte signature: 46 4D 56 1A "FMV\x1A"
|
||||||
string signature = BytesToString(r, 4);
|
string signature = r.ReadStringFixedAscii(4);
|
||||||
if (signature != "FMV\x1A")
|
if (signature != "FMV\x1A")
|
||||||
{
|
{
|
||||||
errorMsg = "This is not a valid .FMV file.";
|
errorMsg = "This is not a valid .FMV file.";
|
||||||
|
@ -604,10 +590,10 @@ namespace BizHawk.MultiClient
|
||||||
// 00E 2-byte little-endian unsigned int: unknown, set to 0000
|
// 00E 2-byte little-endian unsigned int: unknown, set to 0000
|
||||||
r.ReadInt16();
|
r.ReadInt16();
|
||||||
// 010 64-byte zero-terminated emulator identifier string
|
// 010 64-byte zero-terminated emulator identifier string
|
||||||
string emuVersion = RemoveNull(BytesToString(r, 64));
|
string emuVersion = RemoveNull(r.ReadStringFixedAscii(64));
|
||||||
m.Header.Comments.Add(EMULATIONORIGIN + " Famtasia version " + emuVersion);
|
m.Header.Comments.Add(EMULATIONORIGIN + " Famtasia version " + emuVersion);
|
||||||
// 050 64-byte zero-terminated movie title string
|
// 050 64-byte zero-terminated movie title string
|
||||||
string gameName = RemoveNull(BytesToString(r, 64));
|
string gameName = RemoveNull(r.ReadStringFixedAscii(64));
|
||||||
m.Header.SetHeaderLine(MovieHeader.GAMENAME, gameName);
|
m.Header.SetHeaderLine(MovieHeader.GAMENAME, gameName);
|
||||||
if (!controller1 && !controller2 && !FDS)
|
if (!controller1 && !controller2 && !FDS)
|
||||||
{
|
{
|
||||||
|
@ -699,7 +685,7 @@ namespace BizHawk.MultiClient
|
||||||
BinaryReader r = new BinaryReader(fs);
|
BinaryReader r = new BinaryReader(fs);
|
||||||
|
|
||||||
// Check signature
|
// Check signature
|
||||||
string signature = BytesToString(r, 15);
|
string signature = r.ReadStringFixedAscii(15);
|
||||||
if (signature != "Gens Movie TEST")
|
if (signature != "Gens Movie TEST")
|
||||||
{
|
{
|
||||||
errorMsg = "This is not a valid .GMV file.";
|
errorMsg = "This is not a valid .GMV file.";
|
||||||
|
@ -709,16 +695,16 @@ namespace BizHawk.MultiClient
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve ASCII encoded file format version (most recent is 'A')
|
// Retrieve ASCII encoded file format version (most recent is 'A')
|
||||||
string emuVersion = BytesToString(r, 1);
|
string emuVersion = r.ReadStringFixedAscii(1);
|
||||||
m.Header.Comments.Add("emuOrigin Gens version " + emuVersion);
|
m.Header.Comments.Add("emuOrigin Gens version " + emuVersion);
|
||||||
|
|
||||||
uint rerecordCount = r.ReadUInt32();
|
uint rerecordCount = r.ReadUInt32();
|
||||||
m.SetRerecords((int)rerecordCount);
|
m.SetRerecords((int)rerecordCount);
|
||||||
|
|
||||||
// ASCII-encoded controller config for player 1. '3' or '6'.
|
// ASCII-encoded controller config for player 1. '3' or '6'.
|
||||||
string player1Config = BytesToString(r, 1);
|
string player1Config = r.ReadStringFixedAscii(1);
|
||||||
// ASCII-encoded controller config for player 2. '3' or '6'.
|
// ASCII-encoded controller config for player 2. '3' or '6'.
|
||||||
string player2Config = BytesToString(r, 1);
|
string player2Config = r.ReadStringFixedAscii(1);
|
||||||
|
|
||||||
if (player1Config == "6" || player2Config == "6")
|
if (player1Config == "6" || player2Config == "6")
|
||||||
{
|
{
|
||||||
|
@ -746,7 +732,7 @@ namespace BizHawk.MultiClient
|
||||||
r.ReadByte();
|
r.ReadByte();
|
||||||
|
|
||||||
// 40-byte zero-terminated ASCII movie name string
|
// 40-byte zero-terminated ASCII movie name string
|
||||||
string movieName = RemoveNull(BytesToString(r, 40));
|
string movieName = RemoveNull(r.ReadStringFixedAscii(40));
|
||||||
|
|
||||||
string[] stdButtons = new string[8] { "Up", "Down", "Left", "Right", "A", "B", "C", "Start" };
|
string[] stdButtons = new string[8] { "Up", "Down", "Left", "Right", "A", "B", "C", "Start" };
|
||||||
string[] xyzButtons = new string[4] { "X", "Y", "Z", "Mode" };
|
string[] xyzButtons = new string[4] { "X", "Y", "Z", "Mode" };
|
||||||
|
@ -834,7 +820,7 @@ namespace BizHawk.MultiClient
|
||||||
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
|
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
|
||||||
BinaryReader r = new BinaryReader(fs);
|
BinaryReader r = new BinaryReader(fs);
|
||||||
// 000 4-byte signature: 4E 53 53 1A "NSS\x1A"
|
// 000 4-byte signature: 4E 53 53 1A "NSS\x1A"
|
||||||
string signature = BytesToString(r, 4);
|
string signature = r.ReadStringFixedAscii(4);
|
||||||
if (signature != "NSS\x1A")
|
if (signature != "NSS\x1A")
|
||||||
{
|
{
|
||||||
errorMsg = "This is not a valid .NMV file.";
|
errorMsg = "This is not a valid .NMV file.";
|
||||||
|
@ -875,7 +861,7 @@ namespace BizHawk.MultiClient
|
||||||
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
|
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
|
||||||
BinaryReader r = new BinaryReader(fs);
|
BinaryReader r = new BinaryReader(fs);
|
||||||
// 0000: 4-byte signature: "MMV\0"
|
// 0000: 4-byte signature: "MMV\0"
|
||||||
string signature = BytesToString(r, 4);
|
string signature = r.ReadStringFixedAscii(4);
|
||||||
if (signature != "MMV\0")
|
if (signature != "MMV\0")
|
||||||
{
|
{
|
||||||
errorMsg = "This is not a valid .MMV file.";
|
errorMsg = "This is not a valid .MMV file.";
|
||||||
|
@ -907,7 +893,7 @@ namespace BizHawk.MultiClient
|
||||||
// 001c: 4-byte little endian unsigned int: size of input packet
|
// 001c: 4-byte little endian unsigned int: size of input packet
|
||||||
r.ReadUInt32();
|
r.ReadUInt32();
|
||||||
// 0020-005f: string: author info (UTF-8)
|
// 0020-005f: string: author info (UTF-8)
|
||||||
string author = RemoveNull(BytesToString(r, 64));
|
string author = RemoveNull(r.ReadStringFixedAscii(64));
|
||||||
m.Header.SetHeaderLine(MovieHeader.AUTHOR, author);
|
m.Header.SetHeaderLine(MovieHeader.AUTHOR, author);
|
||||||
// 0060: 4-byte little endian flags
|
// 0060: 4-byte little endian flags
|
||||||
byte flags = r.ReadByte();
|
byte flags = r.ReadByte();
|
||||||
|
@ -933,11 +919,11 @@ namespace BizHawk.MultiClient
|
||||||
// bits 4-31: unused
|
// bits 4-31: unused
|
||||||
r.ReadBytes(3);
|
r.ReadBytes(3);
|
||||||
// 0064-00e3: string: rom name (ASCII)
|
// 0064-00e3: string: rom name (ASCII)
|
||||||
string gameName = RemoveNull(BytesToString(r, 128));
|
string gameName = RemoveNull(r.ReadStringFixedAscii(128));
|
||||||
m.Header.SetHeaderLine(MovieHeader.GAMENAME, gameName);
|
m.Header.SetHeaderLine(MovieHeader.GAMENAME, gameName);
|
||||||
// 00e4-00f3: binary: rom MD5 digest
|
// 00e4-00f3: binary: rom MD5 digest
|
||||||
string MD5 = BytesToString(r, 16, true);
|
byte[] MD5 = r.ReadBytes(16);
|
||||||
m.Header.SetHeaderLine("MD5", MD5);
|
m.Header.SetHeaderLine("MD5", String.Format("{0:x8}", BizHawk.Util.BytesToHexString(MD5).ToLower()));
|
||||||
/*
|
/*
|
||||||
76543210
|
76543210
|
||||||
* bit 0 (0x01): up
|
* bit 0 (0x01): up
|
||||||
|
@ -1102,7 +1088,7 @@ namespace BizHawk.MultiClient
|
||||||
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
|
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
|
||||||
BinaryReader r = new BinaryReader(fs);
|
BinaryReader r = new BinaryReader(fs);
|
||||||
// 000 4-byte signature: 56 42 4D 1A "VBM\x1A"
|
// 000 4-byte signature: 56 42 4D 1A "VBM\x1A"
|
||||||
string signature = BytesToString(r, 4);
|
string signature = r.ReadStringFixedAscii(4);
|
||||||
if (signature != "VBM\x1A")
|
if (signature != "VBM\x1A")
|
||||||
{
|
{
|
||||||
errorMsg = "This is not a valid .VBM file.";
|
errorMsg = "This is not a valid .VBM file.";
|
||||||
|
@ -1124,7 +1110,7 @@ namespace BizHawk.MultiClient
|
||||||
recording time in Unix epoch format
|
recording time in Unix epoch format
|
||||||
*/
|
*/
|
||||||
uint uid = r.ReadUInt32();
|
uint uid = r.ReadUInt32();
|
||||||
m.Header.SetHeaderLine(MovieHeader.GUID, uid.ToString());
|
m.Header.SetHeaderLine(MovieHeader.GUID, String.Format("{0:x8}", uid) + "-0000-0000-0000-000000000000");
|
||||||
// 00C 4-byte little-endian unsigned int: number of frames
|
// 00C 4-byte little-endian unsigned int: number of frames
|
||||||
uint frameCount = r.ReadUInt32();
|
uint frameCount = r.ReadUInt32();
|
||||||
// 010 4-byte little-endian unsigned int: rerecord count
|
// 010 4-byte little-endian unsigned int: rerecord count
|
||||||
|
@ -1233,7 +1219,7 @@ namespace BizHawk.MultiClient
|
||||||
024 12-byte character array: the internal game title of the ROM used while recording, not necessarily
|
024 12-byte character array: the internal game title of the ROM used while recording, not necessarily
|
||||||
null-terminated (ASCII?)
|
null-terminated (ASCII?)
|
||||||
*/
|
*/
|
||||||
string gameName = RemoveNull(BytesToString(r, 12));
|
string gameName = RemoveNull(r.ReadStringFixedAscii(12));
|
||||||
m.Header.SetHeaderLine(MovieHeader.GAMENAME, gameName);
|
m.Header.SetHeaderLine(MovieHeader.GAMENAME, gameName);
|
||||||
// 030 1-byte unsigned char: minor version/revision number of current VBM version, the latest is "1"
|
// 030 1-byte unsigned char: minor version/revision number of current VBM version, the latest is "1"
|
||||||
byte minorVersion = r.ReadByte();
|
byte minorVersion = r.ReadByte();
|
||||||
|
@ -1250,10 +1236,10 @@ namespace BizHawk.MultiClient
|
||||||
// 03C 4-byte little-endian unsigned int: offset to the controller data inside file
|
// 03C 4-byte little-endian unsigned int: offset to the controller data inside file
|
||||||
uint firstFrameOffset = r.ReadUInt32();
|
uint firstFrameOffset = r.ReadUInt32();
|
||||||
// After the header is 192 bytes of text. The first 64 of these 192 bytes are for the author's name (or names).
|
// After the header is 192 bytes of text. The first 64 of these 192 bytes are for the author's name (or names).
|
||||||
string author = RemoveNull(BytesToString(r, 64));
|
string author = RemoveNull(r.ReadStringFixedAscii(64));
|
||||||
m.Header.SetHeaderLine(MovieHeader.AUTHOR, author);
|
m.Header.SetHeaderLine(MovieHeader.AUTHOR, author);
|
||||||
// The following 128 bytes are for a description of the movie. Both parts must be null-terminated.
|
// The following 128 bytes are for a description of the movie. Both parts must be null-terminated.
|
||||||
string movieDescription = RemoveNull(BytesToString(r, 128));
|
string movieDescription = RemoveNull(r.ReadStringFixedAscii(128));
|
||||||
m.Header.Comments.Add("comment " + movieDescription);
|
m.Header.Comments.Add("comment " + movieDescription);
|
||||||
/*
|
/*
|
||||||
TODO: implement start data. There are no specifics on the googlecode page as to how long the SRAM or savestate
|
TODO: implement start data. There are no specifics on the googlecode page as to how long the SRAM or savestate
|
||||||
|
@ -1338,7 +1324,7 @@ namespace BizHawk.MultiClient
|
||||||
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
|
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
|
||||||
BinaryReader r = new BinaryReader(fs);
|
BinaryReader r = new BinaryReader(fs);
|
||||||
// 000 12-byte signature: "VirtuaNES MV"
|
// 000 12-byte signature: "VirtuaNES MV"
|
||||||
string signature = BytesToString(r, 12);
|
string signature = r.ReadStringFixedAscii(12);
|
||||||
if (signature != "VirtuaNES MV")
|
if (signature != "VirtuaNES MV")
|
||||||
{
|
{
|
||||||
errorMsg = "This is not a valid .VMV file.";
|
errorMsg = "This is not a valid .VMV file.";
|
||||||
|
|
Loading…
Reference in New Issue