Untitled

 avatar
unknown
plain_text
3 days ago
3.7 kB
4
Indexable
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace ChunkFileProcessor
{
    struct MessageRecord
    {
        public string MessageText;
        public byte[] Header;
        public byte[] Footer;
    }

    class Program
    {
        const int FileHeaderSize = 280;
        const int MessageHeaderSize = 32;
        const int ChunkSizeOffset = 28;
        const int FooterSize = 84;

        static void Main(string[] args)
        {
            if (args.Length < 2)
            {
                Console.WriteLine("Usage: ChunkFileProcessor <inputfile> <outputfile>");
                return;
            }

            string inputPath = args[0];
            string outputPath = args[1];

            if (!File.Exists(inputPath))
            {
                Console.WriteLine("File not found: " + inputPath);
                return;
            }

            byte[] fileBytes = File.ReadAllBytes(inputPath);

            // Read file header
            byte[] fileHeader = new byte[FileHeaderSize];
            Array.Copy(fileBytes, 0, fileHeader, 0, FileHeaderSize);

            List<MessageRecord> records = new List<MessageRecord>();

            int pos = FileHeaderSize;
            while (pos < fileBytes.Length)
            {
                if (pos + MessageHeaderSize > fileBytes.Length) break;
                byte[] header = new byte[MessageHeaderSize];
                Array.Copy(fileBytes, pos, header, 0, MessageHeaderSize);
                pos += MessageHeaderSize;

                int chunkSizeOffset = pos - MessageHeaderSize + ChunkSizeOffset;
                if (chunkSizeOffset + 4 > fileBytes.Length) break;
                int chunkSize = BitConverter.ToInt32(fileBytes, chunkSizeOffset);

                if (pos + chunkSize > fileBytes.Length) break;
                byte[] chunkData = new byte[chunkSize];
                Array.Copy(fileBytes, pos, chunkData, 0, chunkSize);
                string message = Encoding.UTF8.GetString(chunkData);
                pos += chunkSize;

                if (pos + FooterSize > fileBytes.Length) break;
                byte[] footer = new byte[FooterSize];
                Array.Copy(fileBytes, pos, footer, 0, FooterSize);
                pos += FooterSize;

                records.Add(new MessageRecord
                {
                    MessageText = message,
                    Header = header,
                    Footer = footer
                });
            }

            // Example update/translation step
            for (int i = 0; i < records.Count; i++)
            {
                records[i] = new MessageRecord
                {
                    MessageText = records[i].MessageText.ToUpper(),
                    Header = records[i].Header,
                    Footer = records[i].Footer
                };
            }

            using (var ms = new MemoryStream())
            using (var bw = new BinaryWriter(ms))
            {
                bw.Write(fileHeader);

                foreach (var rec in records)
                {
                    bw.Write(rec.Header);
                    byte[] msgBytes = Encoding.UTF8.GetBytes(rec.MessageText);
                    bw.Write(msgBytes);
                    bw.Write(rec.Footer);
                }

                File.WriteAllBytes(outputPath, ms.ToArray());
            }

            Console.WriteLine($"Done. {records.Count} records processed.");
            Console.WriteLine($"Output written to: {outputPath}");
        }
    }
}
Editor is loading...
Leave a Comment