Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.25;
Скачать: CL | DM;

Вниз

Система счесления   Найти похожие ветки 

 
Толян ©   (2005-11-28 16:40) [0]

Как мне загрузить любой файл в Memo в двоичной системе счисления?
Заранее спасибо


 
Ega23 ©   (2005-11-28 16:44) [1]

Написать функцию перевода числа в строку в двоичном виде. И эту строку выводить на экран.


 
PeaK ©   (2005-11-28 16:54) [2]

Для каждого считанного байта, например, восемь раз сделать в цикле сравнение вида
if (b and 128) then
 memo1.text := memo1.text + "1"
else
 memo1.text := memo1.text + "0" ;
а потом сдвиг побитовый влево
 b := b shl 1 ;
Есть варианты заполнения кеша и значительного ускорения алгоритма, но и такого варианта должно хватить


 
Толян ©   (2005-11-29 13:55) [3]

а поподробней можно? :)


 
Ega23 ©   (2005-11-29 13:58) [4]


> а поподробней можно? :)


Куда уж подробней-то...


 
evvcom ©   (2005-11-29 14:01) [5]

Подробней только полный текст модуля и формы. Да и то, тогда вопросы будут типа "а как текст формы применить к проекту?"


 
Толян ©   (2005-11-29 14:03) [6]

а че такое  b и 128


 
Толян ©   (2005-11-29 14:05) [7]

и еще файл не обязательно с чичлами он может быть и текстовой


 
Ega23 ©   (2005-11-29 14:07) [8]

А что есть текст? Текст есть набор байтов.


 
evvcom ©   (2005-11-29 14:09) [9]


> а че такое  b и 128

b - это байт из файла, а 128 - это число такое, умещающееся в байт и старший бит которого равен 1, а остальные нули. А что такое "and" делает вопроса не возникает?

> не обязательно с чичлами он может быть и текстовой

А это по барабану. В двоичном виде все файлы одинаковы, там нет ни чисел, ни текста, там есть только коды. :o)


 
Толян ©   (2005-11-29 14:16) [10]

блин дайте полный код проги пожалучта


 
begin...end ©   (2005-11-29 14:18) [11]

> Толян ©   (29.11.05 14:16) [10]

А пиво будет?


 
Толян ©   (2005-11-29 14:19) [12]

будет :) тока я далеко


 
PeaK ©   (2005-11-29 14:19) [13]

Функция берет байт, возвращает строку из нулей и единичек

function ByteToString(b : byte) : string ;
var
 i : byte ;
begin
 Result := "" ;
 for i := 0 to 7 do
 begin
   if (b and 128) > 0 then
     Result := Result + "1"
   else
     Result := Result + "0" ;
   b := b shl 1 ;
 end ;
end ;

Если что-то интересует еще, например скорасть - есть более быстрый способ.


 
Ega23 ©   (2005-11-29 14:20) [14]


> блин дайте полный код проги пожалучта


Халявщиков - в газенваген!


 
Толян ©   (2005-11-29 14:24) [15]

b : byte -а где его брать??? :)
просто я ешо не доганяю
кароче я начинающий


 
Tonich ©   (2005-11-29 14:27) [16]

наверное тебе уже пора заканчивать

P.S. как ты вообще сразу не кинулся чужие процессы громить )))))


 
Virgo_Style ©   (2005-11-29 14:28) [17]

Толян ©   (29.11.05 14:24) [15]
кароче я начинающий


Неправда, до начинающего еще как до Китая брассом


 
Толян ©   (2005-11-29 14:28) [18]

неа это я умею
вот просто столкнулся с такой бедой а делать не умею :(


 
Tonich ©   (2005-11-29 14:32) [19]

тохда вот это

> неа это я умею

как-то не сочетается с этим  

> b : byte -а где его брать??? :)


> а че такое  b и 128


 
PeaK ©   (2005-11-29 14:33) [20]

Строка
if (b and 128) > 0 then
По порядку - (b and 128) - происходит опрация побитовое И, пусть b представим в общем виде ХХХХ ХХХХ, где Х - бит, который может быть 1 или 0. Битовая последовательность 128 - 1000 0000. Тогда
ХХХХ ХХХХ
логическое И
1000 0000
будут равны
Х000 0000
Таким образом, сравнивая результат с нулем, можем определить ноль в старшем разряде или единица.
b := b shl 1 ;
Побитовый сдвиг всего содержимого влево на одну позицию - если b=0011 1100, то после каждого шага будет содержимое меняться так:
0011 1100 - изначально
0111 1000
1111 0000
1110 0000
1100 0000 и так далее, на новые позиции ставится автоматом ноль. В ассемблере есть подобные операции, но там их больше и они отличаются...


 
Толян ©   (2005-11-29 14:34) [21]

дайте пожалуста полный код проги!


 
begin...end ©   (2005-11-29 14:45) [22]

> Толян ©   (29.11.05 14:19) [12]
> будет

Писал прямо здесь, поэтому не очень оптимально получилось, да и ошибиться мог. Но если работает, то высылайте Балтику N, где N принадлежит [5; 9]. Не вышлете -- пеняйте на себя. Я серьёзно.

function ByteToBin(Value: Byte): string;
var
 I: Integer;
begin
 SetLength(Result, 8);
 for I := 8 downto 1 do
 begin
   if Odd(Value) then
     Result[I] := "1"
   else
     Result[I] := "0";
   Value := Value shr 1
 end
end;

procedure LoadFileToMemo(const FileName: string; Memo: TMemo);
var
 I: Integer;
 S: string;
begin
 with TMemoryStream.Create do
   try
     LoadFromFile(FileName);
     SetLength(S, 8 * Size);
     for I := 0 to Pred(Size) do
       Move(ByteToBin(PByte(Cardinal(Memory) + I)^)[1], S[I * 8 + 1], 8);
     Memo.Lines.Text := S
   finally
     Free
   end
end;

begin
 LoadFileToMemo("C:\MyFile.txt", Memo1)
end.


P.S. Способ подходит для небольших файлов.


 
PeaK ©   (2005-11-29 14:47) [23]

Целиком процедура с форматированным выводом по четыре байта с разделителями... :-)

procedure TForm1.Button1Click(Sender: TObject);
var
 f : file of byte ;
 OurByte : byte ;
 k : byte ;

begin
 Memo1.Clear ;
 AssignFile( f, "c:\config.sys") ;
 Reset(f) ;
 k := 0 ;
 while not Eof(f) do
 begin
   Read(f, OurByte) ;
   Memo1.Text := Memo1.Text + ByteToString(OurByte) ;
   inc(k) ;
   if k = 4 then
   begin
     k := 0 ;
     Memo1.Text := Memo1.Text + #13 + #10 ;
   end
   else
     Memo1.Text := Memo1.Text + " ||| " ;
 end ;
 CloseFile(f) ;
end;


 
Толян ©   (2005-11-29 14:49) [24]

а как большие файлы???


 
Ega23 ©   (2005-11-29 14:51) [25]


> а как большие файлы???


А где пиво новочеркасскому коллеге?


 
evvcom ©   (2005-11-29 14:52) [26]


> Толян ©

Ну выкладывай теперь пиво для begin...end !!!

> begin...end ©   (29.11.05 14:45) [22]

Не будет работать, волшебного слова "unit" нет и многих других. :-)))))


 
begin...end ©   (2005-11-29 14:53) [27]

> Толян ©   (29.11.05 14:49) [24]

Небольшие/большие -- понятие растяжимое. В [22] файл целиком читается в память. Но если можно себе позволить хранить в памяти текст двоичного представления (а он будет занимать в 8 раз больше, чем сам файл), то и сам файл, вероятно, тоже можно позволить целиком загружать в память.

P.S. Пива пока не получил. Жду.


 
Толян ©   (2005-11-29 14:57) [28]

о
 | |
/   \
|пи |
|во |
-----


 
PeaK ©   (2005-11-29 15:00) [29]

Чем не нравится моя процедура? ;-)


 
begin...end ©   (2005-11-29 15:04) [30]

> Толян ©   (29.11.05 14:57) [28]

Всё с тобой, Толян, ясно.
Я предупреждал.


 
Толян ©   (2005-11-29 15:11) [31]

begin...end © все работает тока при больших файл зависате


 
Толян ©   (2005-11-29 15:12) [32]

begin...end © а как я тебе пиво то передам??? :)


 
evvcom ©   (2005-11-29 15:16) [33]


> а как я тебе пиво то передам???

А че в Новочеркасск поезда не ходят?


 
Ega23 ©   (2005-11-29 15:32) [34]


> а как я тебе пиво то передам??? :)


А нефиг тогда в [12] было обещать.
За свои слова отвечать надо.


 
LionMen ©   (2005-11-29 15:48) [35]

ByteToString - такой преобразователь в Делфи нет!!! Подскажите где найти


 
Ega23 ©   (2005-11-29 15:50) [36]


> ByteToString - такой преобразователь в Делфи нет!!! Подскажите
> где найти


Толян, смена ника - не поможет.


 
Tonich ©   (2005-11-29 15:52) [37]


> LionMen ©   (29.11.05 15:48) [35]

))))))))))))))))))))


 
Толян ©   (2005-11-29 15:54) [38]

блин это же прикол! :))))


 
Иксик ©   (2005-11-29 17:02) [39]


> Толян ©   (28.11.05 16:40)  

Меняй профессию! Составь конкуренцию таджикам!


 
evvcom ©   (2005-11-29 17:15) [40]

Толян, ты смотри, счетчик тикает. С пивом не тяни. А то ящик должен будешь! :)))
Ты бы хоть свои координаты в анкете обозначил.



Страницы: 1 2 вся ветка

Текущий архив: 2005.12.25;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.038 c
1-1133431959
Andron.Ru
2005-12-01 13:12
2005.12.25
Как выдернуть текст из адресной строки Explorera


2-1133822308
AssignFile
2005-12-06 01:38
2005.12.25
Когда программа ищет файл в своём каталоге?


14-1133638993
Piter
2005-12-03 22:43
2005.12.25
Российские комманды в европейских кубках


2-1133961934
YDS
2005-12-07 16:25
2005.12.25
Автопрокрутка в RichEdit


2-1134140411
fun
2005-12-09 18:00
2005.12.25
Путь запуска dll