Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Microsoft .NET

  Все выпуски  

RFpro.ru: Microsoft .NET


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Асмик Александровна
Статус: Академик
Рейтинг: 7320
∙ повысить рейтинг »
Micren
Статус: Профессор
Рейтинг: 1795
∙ повысить рейтинг »
Andrew Kovalchuk
Статус: Профессионал
Рейтинг: 702
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Microsoft .NET : C#

Номер выпуска:205
Дата выхода:03.03.2011, 00:00
Администратор рассылки:Alexey G. Gladenyuk (Управляющий)
Подписчиков / экспертов:162 / 59
Вопросов / ответов:1 / 2

Вопрос № 182310: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Как на C# работать с бинарными файлами? Интересует: 1) Как по указанному смещению записать шестандцатеричное значение 00-FF? 2) Как прочитать значение по указанному смещение? Заранее бла...



Вопрос № 182310:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Как на C# работать с бинарными файлами? Интересует:
1) Как по указанному смещению записать шестандцатеричное значение 00-FF?
2) Как прочитать значение по указанному смещение?
Заранее благодарен.

Отправлен: 25.02.2011, 23:34
Вопрос задал: Dimon4ik (5-й класс)
Всего ответов: 2
Страница вопроса »


Отвечает Micren (Профессор) :
Здравствуйте, Dimon4ik!
Примерно так.

Код:
using System;
using System.IO;

namespace Application
{
class MainClass
{
const string FileName = "test.bin";
const long Offset = 16;
const byte Value = 0xff;

public static void Main (string[] args)
{
try {
using (Stream stream = new FileStream (FileName, FileMode.Open))
using (BinaryReader bReader = new BinaryReader (stream))
using (BinaryWriter bWriter = new BinaryWriter (stream)) {
if (stream.CanSeek) {
stream.Seek (Offset, SeekOrigin.Begin);
byte ch = bReader.ReadByte ();
Console.WriteLine ("Текущее значение:{0 }", ch.ToString ("X"));
stream.Seek (Offset, SeekOrigin.Begin);
bWriter.Write (Value);
Console.WriteLine ("Запись выполнена успешно");
} else {
Console.WriteLine ("Невозможно установить позицию в потоке");
}
}
} catch (Exception ex) {
Console.WriteLine ("{0}", ex.ToString ());
}
}
}
}


Или так:
Код:
using System;
using System.IO;

namespace Application
{
class MainClass
{
const string FileName = "test.bin";
const long Offset = 16;
const byte Value = 0xff;

public static void Mai n (string[] args)
{
try {
using (FileStream stream = new FileStream (FileName, FileMode.Open)){
if (stream.CanSeek) {
stream.Seek (Offset, SeekOrigin.Begin);
byte ch = (byte) stream.ReadByte();
Console.WriteLine ("Текущее значение:{0}", ch.ToString ("X"));
stream.Seek (Offset, SeekOrigin.Begin);
stream.WriteByte(Value);
Console.WriteLine ("Запись выполнена успешно");
} else {
Console.WriteLine ("Невозможно установить позицию в потоке");
}
}
} catch (Exception ex) {
Console.WriteLine ("{0}", ex.ToString ());
}
}
}
}

Преимущества 1го способа в том, что можно так читать не только байты и их массивы.

Ответ отправил: Micren (Профессор)
Ответ отправлен: 26.02.2011, 00:04
Номер ответа: 266003
Украина, Краматорск

Оценка ответа: 5
Комментарий к оценке:
Преимущество первого способа будет очень кстати.
Как раз то, что нужно, и даже более. Спасибо большое.
Очень полезный ответ.

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 266003 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Отвечает PsySex (Специалист) :
    Здравствуйте, Dimon4ik!
    Еще один вариант. Недостаток метода - файл полностью читается в оперативную память, в массив, изменяется значение и полностью заново сохраняется массив в файл. Т.е. при внушительных размерах файла и небольшого объема оперативной памяти могут возникнуть задержки на обработку.
    Код:
    using System;
    using System.IO;

    namespace filepatch
    {
    class Program
    {
    public static void Main(string[] args)
    {
    string PatchFile="c:\\Test.bin";
    long OffSet=1000;
    byte Value=0x00;
    byte[] FileBuff;

    if(File.Exists(PatchFile))
    {
    try
    {
    Console.WriteLine("Загрузка файла {0} в память. ..",PatchFile);
    FileBuff=File.ReadAllBytes(PatchFile);
    Console.WriteLine("Файл загружен.");
    Console.WriteLine("Читаем значение по смещению {0}, значение равно {1}",OffSet,FileBuff[OffSet-1]);
    //запись значения по нужному смещению
    FileBuff[OffSet-1]=Value;
    Console.WriteLine("Сохранение файла...");
    File.WriteAllBytes(PatchFile,FileBuff);
    Console.WriteLine("Файл с изменениями успешно сохранен!!!");
    }
    catch
    {
    Console.WriteLine("Ошибка чтения/записи файла {0}...",PatchFile);
    }
    }
    else
    {
    Console.WriteLine("Файл не найден!!!");
    }

    Console.WriteLine("Press any key to continue . . . ");
    Console.ReadKey(true);
    }
    }
    }

    -----
    Bom Shankar!

    Ответ отправил: PsySex (Специалист)
    Ответ отправлен: 26.02.2011, 20:15
    Номер ответа: 266013
    Россия, Орёл

    Оценка ответа: 5
    Комментарий к оценке:
    Тем не менее, при достаточном количестве оперативной памяти, возможно, данный способ будет работать быстрее чем остальные. Так как файл уже загружен в память. Спасибо за ответ.
    Очень полезен. Думаю мне будет достаточно вариантов для размышления.

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 266013 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное