Beispiel #1
0
            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);
            }
Beispiel #2
0
            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;
            }