Имеется конструкция, которая производит чтение данных либо с текстового файла, либо с клавиатуры. Возникло два вопроса:
Что надо изменить, чтобы при чтении из файла корректно читался русский язык?
Возможно, сможете помочь. Данная конструкция является частью программы по стеганографии. Если встраивается в аудио английский текст, то извлечение этого текста из аудио происходит корректно. Если же встраивается текст на русском языке, то происходит извлечение только лишь ровно половины спрятанного текста. В чем может быть проблема?
Код чтения с файла/с клавиатуры:
private Stream GetMessageStream()
{
BinaryWriter messageWriter = new BinaryWriter(new MemoryStream());
if (rdoMsgFile.Checked)
{
//чтение из файла
var fs = new FileStream(txtMsgFile.Text, FileMode.Open);
int fileLength = (int)fs.Length;
messageWriter.Write(fileLength);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, fileLength);
messageWriter.Write(buffer);
fs.Close();
}
else
{
// чтение с клавиатуры
messageWriter.Write(txtMessage.Text.Length);
messageWriter.Write(Encoding.UTF8.GetBytes(txtMessage.Text));
}
messageWriter.Seek(0, SeekOrigin.Begin);
return messageWriter.BaseStream;
}
Нет такого понятия — текстовый файл без кодировки. Текстовый файл обязательно имеет какую-то кодировку. Указывайте кодировку при открытии. Нет, надёжного метода узнать кодировку, не зная её, нет.
Вы пишете в messageWriter
длину текста в символах, а потом кладёте туда байты. Вероятно, проблема в этом: длина в символах не равна длине в байтах.
Кстати, как-то слишком сложно работаете с файлом. Я бы на вашем месте просто использовал
byte[] buffer = File.ReadAllBytes(txtMsgFile.Text);
messageWriter.Write(buffer.Length);
messageWriter.Write(buffer);
Но поскольку вам нужно перекодировать файл, скорее всего, корректнее будет так:
string text = File.ReadAllText(txtMsgFile.Text, encoding); // <-- encoding важно
byte[] buffer = Encoding.UTF8.GetBytes(text);
И вообще весь код выглядел бы тогда просто так:
string text = rdoMsgFile.Checked ?
File.ReadAllText(txtMsgFile.Text, encoding) : txtMessage.Text;
byte[] buffer = Encoding.UTF8.GetBytes(text);
messageWriter.Write(buffer.Length);
messageWriter.Write(buffer);
Виртуальный выделенный сервер (VDS) становится отличным выбором
Добрый деньПодскажите как заставить форму перемещаться удалив у нее рамку? Тоесть у меня у MainForm выключен ControlBox и BorderStyle - None И форма не двигается...
Как можно сделать так, чтобы форма запускалась и работала только при запущенном процессе?
Как определить что программа запущена в первый раз? Без создания папок или файлов настроекЭти способы я знаю