Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 827

Раздел: Delphi » Прочее
/ вопрос решён /

Доброго времени суток, уважаемые эксперты!
Я пишу систему передачи данных с повышением верности, т.е. систему передачи с обнаружением и исправление ошибок(избыточное кодирование). Столкнулся с такой проблемой: как на Delphi работать с двоичной информацией непосредственно? Например, как сложить два двоичных числа по модулю 2? Помогите пожалуйста, и, если можно, без ассемблера.

volonter Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: volonter (статус: Посетитель)
Вопрос отправлен: 4 августа 2007, 15:18
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: mvp

Здравствуйте, volonter!
Стандартные операции - not, or, and, xor, shl, shr
Для использования логических оп-ций, операнды должны быть целочисленного типа.
not A - меняет в числе A биты на противоположные (логическое отрицание)
A and B - логическое И - в итоге единичные биты останутся только на тех местах, где были единички одновременно и в A и в B
A or B - логическое ИЛИ - единичные биты будут на тех местах, где были единички или в А или в B.
A xor B - исключающее ИЛИ (сложение по модулю 2) - единичка на тех местах, где в А и в В были разные биты
A shl n - логический сдвиг числа А на n бит влево - эквивалентно A * (2^n)
A shr n - логический сдвиг числа B на n бит вправо - эквивалентно [A / (2^n)] (на цело)

Последние 2 команды меняют значение операнда. Остальные - нет

Ответ отправил: mvp (статус: 4-ый класс)
Время отправки: 4 августа 2007, 18:16
Оценка за ответ: 5

Комментарий к оценке: Спасибо

Ответ #2. Отвечает эксперт: Feniks

Здравствуйте, volonter!
Я на сайт в раздел Исходники выложил библиотеку HashLib. Я так думаю, она должна Вам помочь...

HashLib! is a fast and flexible library for Delphi, where are implemented most of common hash algorithms. It provides easy to use low and high level functions. I decided to write this lib because of lack of such things for Delphi and quite a bad quality of them (this lib contais parts being rewritten in assembler). This library was written in Delphi (tested on Delphi5, Delphi6, Delphi7). Also it works fine in C++ Builder 4 (and it should work on newer verions). Source code is included and could be modified without any limitations.


Implemented algorithms
- MD2 (RFC1319), MD4 (RFC1320), MD5 (RFC1321)
- SHA1(FIPS 180-1), SHA256, SHA384, SHA512 (FIPS PUB 180-2)
- Haval128, Haval160, Haval192, Haval224, Haval256 by Y. Zheng, J. Pieprzyk and J. Seberry
- Gost (GOST R 34.11-94)
- Tiger128, Tiger160, Tiger192 by Ross Anderson and Eli Biham
- RipeMD128, RipeMD160 by Hans Dobbertin, Antoon Bosselaers, and Bart Preneel
- CRC32, CRC32b
- Adler32

Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 6 августа 2007, 13:40
Оценка за ответ: 5

Комментарий к оценке: Спасибо

Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 7 августа 2007, 21:18; участников в обсуждении: 4.
Вадим К

Вадим К (статус: Академик), 5 августа 2007, 21:43 [#1]:

to mvp:

Цитата:


Последние 2 команды меняют значение операнда. Остальные - нет

Поподробнее с этого момента. с каких пор?
Вы имеете в виду, что в виражении x := f shl 2; значение f смениться? Тогда попробуйте обяснить как же вычисляется значение выражения 5 shl 2
Галочка "подтверждения прочтения" - вселенское зло.
mvp

mvp (статус: 4-ый класс), 5 августа 2007, 23:15 [#2]:

Угу, протупил - конечно же не меняют
Feniks

Feniks (статус: Бакалавр), 6 августа 2007, 13:58 [#3]:

Здравствуйте, volonter!
Вот один пример простенького шифрования... Там же показано как работать с байтами и с xor и shr.

unit EncryptIt;

interface
USES
Classes;

function Encrypt(const S: String; Key,C1,C2: Word): String;
function Decrypt(const S: String; Key,C1,C2: Word): String;
procedure EncryptFile(INFName, OutFName : String; Key,C1,C2 : Word);
procedure DecryptFile(INFName, OutFName : String; Key,C1,C2 : Word);

implementation

function Encrypt(const S: String; Key,C1,C2: Word): String;
var
I: Integer;
begin
Result := S;
for I := 1 to Length(S) do
begin
Result[I] := char(byte(S[I]) xor (Key shr 8));
Key := (byte(Result[I]) + Key) * C1 + C2;
end;
end;

function Decrypt(const S: String; Key,C1,C2: Word): String;
var
I: Integer;
begin
Result := S;
for I := 1 to Length(S) do
begin
Result[I] := char(byte(S[I]) xor (Key shr 8));
Key := (byte(S[I]) + Key) * C1 + C2;
end;
end;


procedure EncryptFile(INFName, OutFName : String; Key,C1,C2 : Word);
VAR
MS, SS : TMemoryStream;
X : Integer;
C : Byte;
begin
MS := TMemoryStream.Create;
SS := TMemoryStream.Create;
TRY
MS.LoadFromFile(INFName);
MS.Position := 0;
FOR X := 0 TO MS.Size - 1 DO
begin
MS.Read(C, 1);
C := (C xor (Key shr 8));
Key := (C + Key) * C1 + C2;
SS.Write(C,1);
end;
SS.SaveToFile(OutFName);
FINALLY
SS.Free;
MS.Free;
end;
end;

procedure DecryptFile(INFName, OutFName : String; Key,C1,C2 : Word);
VAR
MS, SS : TMemoryStream;
X : Integer;
C, O : Byte;
begin
MS := TMemoryStream.Create;
SS := TMemoryStream.Create;
TRY
MS.LoadFromFile(INFName);
MS.Position := 0;
FOR X := 0 TO MS.Size - 1 DO
begin
MS.Read(C, 1);
O := C;
C := (C xor (Key shr 8));
Key := (O + Key) * C1 + C2;
SS.Write(C,1);
end;
SS.SaveToFile(OutFName);
FINALLY
SS.Free;
MS.Free;
end;
end;

end.
Вадим К

Вадим К (статус: Академик), 6 августа 2007, 14:05 [#4]:

Feniks:
обнаружением и исправление ошибок(избыточное кодирование)
и шифрование/хеширование - это немного разные вещи
Галочка "подтверждения прочтения" - вселенское зло.
Feniks

Feniks (статус: Бакалавр), 6 августа 2007, 14:44 [#5]:

Вадим К :
Я это прекрастно понимаю.
Я просто хотел привести примеры по работе с байтами и соответствующими функциями...
volonter

volonter (статус: Посетитель), 7 августа 2007, 21:18 [#6]:

Спасибо всем за обсуждение этого вопроса. Я уже сам разобрался

31 января 2011, 19:29: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:57
Выполнено за 0.03 сек.