Побитовое чтение бинарника

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Sonatic, 25 Jan 2010.

  1. Sonatic

    Sonatic Banned

    Joined:
    25 Oct 2008
    Messages:
    14
    Likes Received:
    41
    Reputations:
    0
    Стоит задача:
    Дан начальный двоичный файл любого формата (mp3,avi, и т.д.)

    Требуется считать его содержимое и представить его в виде битовой последовательности, язык реализации Borland C++ 3.1
    Далее требуется произвести скремблирование и записать результирующий файл.
    Вопрос: Каким образом можно реализовать побитовое чтение файла?
     
  2. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    1 бит - это 1/8 часть байта, т.е.
    Code:
     
    const Bit = 1024 div 8;
    
    затем цикл от 0 до общего размера. и там как то так. в общем развивайте идею)
     
  3. RaX

    RaX Member

    Joined:
    7 Jun 2008
    Messages:
    34
    Likes Received:
    34
    Reputations:
    0
    можно сделать массив констант чисел степени двойки (1,2,4...128) и каждое число (точнее аски-код символа) проверять.

    1.Берем текущую константу (сначала 128)
    2.Если константа меньше числа, то текущий бит (1-ый) равен 0, иначе вычитаем из числа константу и текущий бит равен 1.
    3.Возвращаемся на шаг 1 для следующего бита (2 бит и константа 64)


    и т.д. пока мы не проверим все биты.

    также во многих языках можно сдлеать так:
    Code:
    if x and 128 > 0 then
    begin
     //1-ый бит = 1
    end
    else
    begin
     //1-ый бит = 0
    end;
    
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    а кто тебе не дает читать по 1 байту и сразу разбивать на биты?
    Допустим можеш к примеру описать структуру
    typedef struct _BITS
    {
    BYTE b0:1;
    BYTE b1:1;
    BYTE b2:1;
    BYTE b3:1;
    BYTE b4:1;
    BYTE b5:1;
    BYTE b6:1;
    BYTE b7:1;
    } BITS, *PBITS;

    И теперь просто создай переменную
    BITS b;
    и считывай сразу в ней 1 байт. И у тебя есть сразу доступ к битам.
    b.b1 b.b3 итд итп