簡體   English   中英

C#二進制編寫返回更大的文件

[英]C# binary writing return bigger file

即時通訊在二進制編寫器問題上遇到了一些麻煩,我的程序設置為加載SHIFT-JIS字符,並以相同的編碼進行寫入,但是它返回的文件尺寸更大:s盡管我刪除了幾個字符,但這是一個示例寫入之前和之后的文件 ,這些是打開和保存的代碼:

private void Openbtn_Click(object sender, EventArgs e)
    {
        listView1.Items.Clear();
        textBox1.Text = "";
        menuItem12.Text = "file type is: ";
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Title = "Open File";
        ofd.Filter = "All Files (*.*)|*.*";
        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            menuItem13.Enabled = true;
            menuItem14.Enabled = true;
            menuItem15.Enabled = true;
            path = ofd.FileName;
            BinaryReader br = new BinaryReader(File.OpenRead(path), Encoding.GetEncoding("SHIFT-JIS"));
            foreach (char mychar in br.ReadChars(4)) menuItem12.Text += mychar;
            if (menuItem12.Text != "file type is: TXTD")
            {
                MessageBox.Show("This is not a TXTD file...", "Sorry", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            else
            {
                    MessageBox.Show("File opened Succesfully!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    br.BaseStream.Position = 0x8;
                    int Pntrnum = br.ReadInt16();
                    menuItem11.Visible = true;
                    menuItem11.Text = Pntrnum.ToString();
                    List<int> offsets = new List<int>();
                    br.BaseStream.Position = 0x10;
                    for (int i = 0; i < Pntrnum; i++)
                    {
                        offsets.Add(br.ReadInt32());
                    }
                    Dictionary<int, string> values = new Dictionary<int, string>();
                    for (int i = 0; i < offsets.Count; i++)
                    {
                        int currentOffset = offsets[i];

                        int nextOffset = (i + 1) < offsets.Count ? offsets[i + 1] : (int)br.BaseStream.Length;

                        int stringLength = (nextOffset - currentOffset - 1);

                        br.BaseStream.Position = currentOffset;

                        var chars = br.ReadChars(stringLength);
                        values.Add(currentOffset, new String(chars));
                    }

                    foreach (int offset in offsets)
                    {
                        listView1.Items.Add(offset.ToString("X")).SubItems.Add(values[offset]);
                    }

                    br.Close();
                    br = null;
            }
        }
        ofd.Dispose();
        ofd = null;
    }
private void Savebtn_Click(object sender, EventArgs e)
    {
        BinaryWriter bw = new BinaryWriter(File.OpenWrite(path));

        int number_pointers = Convert.ToInt32(menuItem11.Text);

        Encoding enc = Encoding.GetEncoding("SHIFT-JIS");

        bw.BaseStream.Position = 0x10;
        int curr_pointer = 16 + number_pointers * 4;

        //pointers writing
        for (int i = 0; i < number_pointers; i++)
        {
            bw.Write(curr_pointer);
            curr_pointer += enc.GetByteCount(listView1.Items[i].SubItems[1].Text) + '\0';
        }

        for (int i = 0; i < number_pointers; i++)
        {
            bw.Write(enc.GetBytes(listView1.Items[i].SubItems[1].Text + '\0'));
        }

        bw.Flush();
        bw.Close();
        bw = null;
    }

我非常感謝您的幫助。

在您提供的Samples.zip中的“ After”文件中查看,似乎表明您兩次輸出相同的字符串,或類似的內容。

我建議您從較小的文件開始進行測試,並使用調試器介入。

其實,我自己嘗試了一下,我想我發現了怎么回事:您使用“ nextOffset-currentOffset”作為stringLength,但實際上是BYTE-Length ... char數組將結束(具有'\\ 0 (在里面)),僅在此數字的一半之后,並且在輸出時也會得到下半部分,即您尚未閱讀。

[編輯]從下面的評論中發布代碼,以獲得更好的格式:

int index;
for (index = 0; index < stringLength; ++index) if (chars[index] == '\0') break;
if (index < stringLength) {
    char[] relevantPart = new char[index];
    Array.Copy(chars, relevantPart, index);
    chars = relevantPart;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM