2016-04-07 2 views
0

Я сделал инструмент, который я сделал для шифрования и расшифровки сообщений. Не то чтобы я работаю для военных или чего-то еще, меня просто заинтересовала концепция.BinaryReader и BinaryWriter для динамического короткого массива

Он принимает каждого персонажа и преобразует его в мой личный двоичный формат. Каждый символ расширен до 16 бит или short. Каждое из этих коротких целых чисел хранится в одном массиве.

Моя цель - записать этот массив в файл в двоичном формате и иметь возможность прочитать его обратно в массив.

Вот что я начал:

//This is the array the encrypted characters are stored in. 
short[] binaryStr = new short[32767]; 

//... 

private void butSelInput_Click(object sender, EventArgs e) 
{ 
    dialogImportMsg.ShowDialog(); 
} 

private void dialogImportMsg_FileOk(object sender, CancelEventArgs e) 
{ 
    using (BinaryReader reader = new BinaryReader(new FileStream(dialogImportMsg.FileName, FileMode.Open))) 
    { 
     for (short x = 0; x < (short)reader.BaseStream.Length; x++) 
     { 
      binaryStr[x] = reader.ReadInt16(); 
     } 
    } 
} 

private void butExport_Click(object sender, EventArgs e) 
{ 
    dialogExportMsg.ShowDialog(); 
} 

private void dialogExportMsg_FileOk(object sender, CancelEventArgs e) 
{ 
    using (BinaryWriter writer = new BinaryWriter(new FileStream(dialogExportMsg.FileName, FileMode.OpenOrCreate))) 
    { 
     for (int x = 0; x < binaryStr.Length; x++) 
     { 
      //if(binaryStr[x] 
      writer.Write(BitConverter.GetBytes(binaryStr[x])); 
     } 
    } 
} 

Очевидно, что я буду об этом неправильно, так как это не работает, как я хочу, чтобы это. Писатель может работать, но он записывает весь массив, который составляет 65534 байта. Я хочу, чтобы он только записывал символы, которые хранятся (т. Е. Все до последнего ненулевого символа). Тогда читателю следует соответствовать этому, читая символы из файла и помещая их в массив точно так же, как они были, когда они были экспортированы.

Итак, вопрос в том, как это сделать?

+0

Вы пытались что-то с 'if (binaryStr [x])', разве это не работало? – niksofteng

+0

Я собирался попытаться закончить цикл раньше ... Просто не знал, куда идти. –

+0

Да, с какой проблемой вы столкнулись в этом? – niksofteng

ответ

0

Я решил просто сохранить длину исходной строки. Я буду использовать его для цикла записи, сохранить его в файле и прочитать его позже.

private void dialogImportMsg_FileOk(object sender, CancelEventArgs e) 
    { 
     using (BinaryReader reader = new BinaryReader(new FileStream(dialogImportMsg.FileName, FileMode.Open))) 
     { 
      binaryStrLen = reader.ReadInt16(); 
      for (short x = 0; x < binaryStrLen; x++) 
      { 
       binaryStr[x] = reader.ReadInt16(); 
      } 
     } 
    } 

    private void butExport_Click(object sender, EventArgs e) 
    { 
     dialogExportMsg.ShowDialog(); 
    } 

    private void dialogExportMsg_FileOk(object sender, CancelEventArgs e) 
    { 
     using (BinaryWriter writer = new BinaryWriter(new FileStream(dialogExportMsg.FileName, FileMode.OpenOrCreate))) 
     { 
      writer.Write(BitConverter.GetBytes(binaryStrLen)); 
      for (int x = 0; x < binaryStrLen; x++) 
      { 
       writer.Write(BitConverter.GetBytes(binaryStr[x])); 
      } 
     } 
    }