-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:
brandman211 2012-03-06 05:27:50 +00:00
parent c9b5f9989a
commit e7e8402af0
2 changed files with 33 additions and 38 deletions

View File

@ -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

View File

@ -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.";