Конференция "WinAPI" » Чтение big-endian и little-endian
 
  • EgorovAlex © (30.03.12 11:49) [0]
    Здравствуйте,

    Есть класс - читатель файлов, примерная схема:


    TCustomMappedStream = class(TStream)
     private
       <внутренности>
     public
       function Read(var Buffer; Count: Longint): Longint; override;
       function Seek(const Offset: Int64; Origin:TSeekOrigin): Int64; override;
     end;



    Он целиком создан и работоспособен для little-endian файлов

    Теперь хочется его адаптировать и для big-endian файлов, чтобы был универсален, но и не хочется терять производительность

    Как я сделал сейчас:
    добавил public property Swapped: Boolean

    в Read добавился код:

    begin
     <старый код>;
     if Swapped then
       <переворачиваем данные>;
    end;

    Этот код работоспособен, но не оптимален, на мой взгляд, т.к. для каждой операции чтения производится проверка Swapped.

    Как хотелось бы в теории: есть две приватные функции - прямого и обратного чтения и есть паблик функция указатель на одну из этих функций, при изменении Swapped переменной меняем указатель на функцию и далее всё работает без постоянной проверки Swapped.

    Возможно ли такое реализовать и как?
  • brother © (30.03.12 11:57) [1]
    > big-endian и little-endian

    что это?
  • EgorovAlex © (30.03.12 12:02) [2]
  • han_malign (30.03.12 13:19) [3]

    > Возможно ли такое реализовать и как?

    - а ты уверен, что косвенный вызов быстрее чем элементарное ветвление???

    T(CustomMapped)Stream - семантически не должен производит никаких трансформаций данных - этим должен заниматься более высокий слой реализации...

    И файлы не бывают ни остроконечными, ни тупоконечными - т.к. по определению - это именованная последовательность данных. А абстракция этих данных - никакого отношения собственно к файлам уже не имеет...
  • EgorovAlex © (30.03.12 13:24) [4]
    Ну у меня уже есть рабочий вариант, который указал тут, вопрос так и стоит - можно ли оптимальнее, понятно, что это можно и в потомке этого класса сделать, вопрос про оптимальность стоит
  • MBo © (30.03.12 16:00) [5]
    >Возможно ли такое реализовать и как?
    Да, возможно, пример:
    http://www.delphimaster.ru/articles/pixels/index.html
    Часть "Методы доступа к значению цвета в указанной точке"

    Однако нужно ли?
    Проверка if Swapped  - вряд ли будет причиной медленной работы...
  • DVM © (30.03.12 16:46) [6]

    >
    > Возможно ли такое реализовать и как?

    Как то так:


     TSwappedStream = class(TStream)
     protected
       FStream: TStream;
       FOwnsStream: Boolean;
     protected
       procedure Swap(const Buffer; Len: integer);
     public
       constructor Create(AStream: TStream; AOwnsStream: Boolean = False);
       destructor Destroy; override;
       function Read(var Buffer; Count: Integer): Longint; override;
       function Write(const Buffer; Count: Integer): Longint; override;
       property Stream: TStream read FStream;
     end;



    В Read и Write переворачивай буфер Swap():


    function THexTextStream.Read(var Buffer; Count: Integer): Longint;
    begin
     result := FStream.Read(Buffer, Count);
     Swap(Buffer, Count);
    end;

  • Германн © (31.03.12 02:00) [7]

    > Есть класс - читатель файлов
    > Он целиком создан и работоспособен для little-endian файлов


    А что это за файлы такие?
    P.S. Пожалуйста не повторяйте в ответ вашу ссылку на вики. Меня  интересует именно именно тип файлов. И для чего они нужны?

    P.P.S.
    Пример MBO конечно рассматривает "нечто подобное". Но у меня нет никакой уверенности, что сей пример вам поможет. Ибо в нём рассматривается работа с весьма конкретными файлами.
  • EgorovAlex © (02.04.12 08:42) [8]
    Да я уже отказался от своей идеи, проще с ручной проверкой, тем более там можно блоками проверять и читать, а не каждый раз, но информацию полезную почерпнул, спасибо

    А файлы - это файлы спулера печати, там информация представлена как правило с самом разнообразном виде: тектовый, бинарный и совместный
 
Конференция "WinAPI" » Чтение big-endian и little-endian
Есть новые Нет новых   [134431   +5][b:0][p:0.001]