public bool ReadFile(ArraySegment <byte> data, ref int size) { var offs = data.Offset; String Identifier = CSF.ReadCString(data, 4, offs); offs += 4; if (!Identifier.Equals(" LBL")) { return(false); } StringCount = BitConverter.ToInt32(data.Array, offs); offs += 4; uint LabelLength = BitConverter.ToUInt32(data.Array, offs); offs += 4; if (offs + LabelLength > data.Array.Length) { return(false); } ID = CSF.ReadCString(data, LabelLength, offs); offs += (int)LabelLength; for (var ixStr = 0; ixStr < StringCount; ++ixStr) { if (offs + 8 > data.Array.Length) { return(false); } String strIdent = CSF.ReadCString(data, 4, offs); offs += 4; var isPlain = strIdent.Equals(" RTS"); var isExtended = strIdent.Equals("WRTS"); if (isPlain || isExtended) { var Val = new CSFValue(); var VLen = BitConverter.ToInt32(data.Array, offs); offs += 4; if (offs + VLen * 2 > data.Array.Length) { return(false); } for (var i = 0; i < VLen; ++i) { var raw = BitConverter.ToUInt16(data.Array, offs); offs += 2; raw ^= 0xFFFF; Val.Plain += (char)raw; } if (isExtended) { if (offs + 4 > data.Array.Length) { return(false); } var XLen = BitConverter.ToUInt32(data.Array, offs); offs += 4; if (offs + XLen > data.Array.Length) { return(false); } Val.Extra = CSF.ReadCString(data, XLen, offs); offs += (int)XLen; } Values.Add(Val); } else { return(false); } } size = offs - data.Offset; return(true); }
public bool ReadFile(ArraySegment<byte> data, ref int size) { var offs = data.Offset; String Identifier = CSF.ReadCString(data, 4, offs); offs += 4; if (!Identifier.Equals(" LBL")) { return false; } StringCount = BitConverter.ToInt32(data.Array, offs); offs += 4; uint LabelLength = BitConverter.ToUInt32(data.Array, offs); offs += 4; if (offs + LabelLength > data.Array.Length) { return false; } ID = CSF.ReadCString(data, LabelLength, offs); offs += (int)LabelLength; for (var ixStr = 0; ixStr < StringCount; ++ixStr) { if (offs + 8 > data.Array.Length) { return false; } String strIdent = CSF.ReadCString(data, 4, offs); offs += 4; var isPlain = strIdent.Equals(" RTS"); var isExtended = strIdent.Equals("WRTS"); if (isPlain || isExtended) { var Val = new CSFValue(); var VLen = BitConverter.ToInt32(data.Array, offs); offs += 4; if (offs + VLen * 2 > data.Array.Length) { return false; } for (var i = 0; i < VLen; ++i) { var raw = BitConverter.ToUInt16(data.Array, offs); offs += 2; raw ^= 0xFFFF; Val.Plain += (char)raw; } if (isExtended) { if (offs + 4 > data.Array.Length) { return false; } var XLen = BitConverter.ToUInt32(data.Array, offs); offs += 4; if (offs + XLen > data.Array.Length) { return false; } Val.Extra = CSF.ReadCString(data, XLen, offs); offs += (int)XLen; } Values.Add(Val); } else { return false; } } size = offs - data.Offset; return true; }