Corrected UniqueId implementation.

Thanks @Anaminus!
This commit is contained in:
Max 2022-04-24 22:28:42 -05:00
parent 3209d87331
commit f2d751a4c9
3 changed files with 45 additions and 8 deletions

View File

@ -656,8 +656,10 @@ namespace RobloxFiles.BinaryFormat.Chunks
{ {
readProperties(i => readProperties(i =>
{ {
var buffer = reader.ReadBytes(16); var index = reader.ReadUInt32();
return new Guid(buffer); var time = reader.ReadUInt32();
var random = reader.ReadUInt64();
return new UniqueId(index, time, random);
}); });
break; break;
@ -1293,9 +1295,10 @@ namespace RobloxFiles.BinaryFormat.Chunks
{ {
props.ForEach(prop => props.ForEach(prop =>
{ {
var guid = prop.CastValue<Guid>(); var uniqueId = prop.CastValue<UniqueId>();
byte[] buffer = guid.ToByteArray(); writer.Write(uniqueId.Index);
writer.Write(buffer); writer.Write(uniqueId.Time);
writer.Write(uniqueId.Random);
}); });
break; break;

16
DataTypes/UniqueId.cs Normal file
View File

@ -0,0 +1,16 @@
namespace RobloxFiles.DataTypes
{
public struct UniqueId
{
public readonly uint Time;
public readonly uint Index;
public readonly ulong Random;
public UniqueId(uint time, uint index, ulong random)
{
Time = time;
Index = index;
Random = random;
}
}
}

View File

@ -1,9 +1,10 @@
using System; using System;
using System.Xml; using System.Xml;
using RobloxFiles.DataTypes;
namespace RobloxFiles.Tokens namespace RobloxFiles.Tokens
{ {
public class UniqueId : IXmlPropertyToken public class UniqueIdToken : IXmlPropertyToken
{ {
public string XmlPropertyToken => "UniqueId"; public string XmlPropertyToken => "UniqueId";
@ -13,7 +14,13 @@ namespace RobloxFiles.Tokens
if (Guid.TryParse(hex, out var guid)) if (Guid.TryParse(hex, out var guid))
{ {
prop.Value = guid; var bytes = guid.ToByteArray();
var random = BitConverter.ToUInt64(bytes, 0);
var time = BitConverter.ToUInt32(bytes, 8);
var index = BitConverter.ToUInt32(bytes, 12);
prop.Value = new UniqueId(time, index, random);
return true; return true;
} }
@ -22,7 +29,18 @@ namespace RobloxFiles.Tokens
public void WriteProperty(Property prop, XmlDocument doc, XmlNode node) public void WriteProperty(Property prop, XmlDocument doc, XmlNode node)
{ {
var guid = prop.CastValue<Guid>(); var uniqueId = prop.CastValue<UniqueId>();
var random = BitConverter.GetBytes(uniqueId.Random);
var time = BitConverter.GetBytes(uniqueId.Time);
var index = BitConverter.GetBytes(uniqueId.Index);
var bytes = new byte[16];
random.CopyTo(bytes, 0);
time.CopyTo(bytes, 8);
index.CopyTo(bytes, 12);
var guid = new Guid(bytes);
node.InnerText = guid.ToString("N"); node.InnerText = guid.ToString("N");
} }
} }