2013-04-21 3 views
0

바이너리 라이터 문제로 약간의 문제가 생기고 내 프로그램이 SHIFT-JIS 문자를로드하도록 설정되어 동일한 인코딩으로 작성되지만 크기가 더 큰 파일을 반환합니다. 여러 문자, here is a sample of the files before and after writing을 제거, 이것들은 열려 있고 코드를 저장합니다C# 바이너리 쓰기 더 큰 파일

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에서 파일을 두 번 같은 문자열을 출력, 또는 뭔가 있다는 것을 나타내는 것 같다 "후"는 ...

내가 테스트하는 작은 파일로 시작하는 것이 좋습니다 것입니다 내부 찾고

+0

:

[편집] 더 나은 서식, 아래 내 댓글의 코드를 게시 그 함수는 무섭게 뭔가 잘못하고있다. 그렇지 않으면 항상 menuItem1이 같은가? – Sayse

+0

menuitem1은 openbtn입니다. 그래서 저는 UBS가 오픈 함수에서 뭔가 잘못하고 있다고 생각할 수 있습니다. UTF가 아닌 JAP 문자를 읽는 것과 같습니다. 샘플 파일은 아래에 있습니다. 너의 서비스. – Omarrrio

+0

저장 기능을 콘솔 응용 프로그램으로 복사하고'.text' 값을 예제로 유효한 항목으로 변경하는 것이 좋습니다. 파일 링크를 클릭하는 것을 좋아하지 않습니다. 죄송합니다. 편집 : 나는 또한 Shift-JIS로 많은 작업을 해왔고 가능하다면 UTF-8을 어쨌든 사용할 수있는 암호화의 악몽이라고 생각합니다. 많이 더 – Sayse

답변

3

디버거를 사용하여 단계별로 디버거를 사용하십시오.

사실, 나 자신을 시험해 보았습니다. 무슨 일이 일어나고 있는지 알았습니다. "nextOffset - currentOffset"을 stringLength로 사용하고 있지만 실제로는 BYTE- 길이 ... 문자 배열은이 숫자의 절반 만 끝나면 끝나고 (내부에 '\ 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; 
} 
+0

어쨌든 길이를 설정할 수있는 위치는 0x00입니다. – Omarrrio

+1

물론, 관련 문자 만 저장하려면 새 배열이 필요합니다 ... int index; if (chars [index] == '\ 0') break (index = 0; index

+0

감사합니다. 그러나 여전히 오류가 있습니다 : ** '과부하 메소드'복사 '는 Array.Copy 행에 4 개의 인수 **가 필요합니다 :/ – Omarrrio