|
Вопрос # 6 421/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Я нашел нужный мне модуль для работы со строками: преобразование систем счисления, перевод в верхний/нижний регистр, отсечение и выравнивание, выборка и подсчет слов и еще много чего, но проблема в том что выдает ошибку при компиляции именно в самом модуле.
Не могу понять что не так.
function HexB(B : Byte) : string;
{-Return hex string for byte}
var HexB: string;
begin
HexB[0] := #2;
HexB[1] := Digits[B shr 4];
HexB[2] := Digits[B and $F];
end;
В этом коде выдает ошибку при записи в нулевой бит. Как это исправить?
Еще добавляю данный модуль целиком.
Я подключал его через Uses.
Прошу помощи, потому как сам не в состоянии разобраться.
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
 |
Вопрос задал: disillusion (статус: Посетитель)
Вопрос отправлен: 6 мая 2013, 21:44
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 15; последнее сообщение — 7 мая 2013, 11:48; участников в обсуждении: 2.
|
min@y™ (статус: Доктор наук), 7 мая 2013, 08:13 [#1]:
Цитата (disillusion):
выдает ошибку при записи в нулевой бит
Символы строк типа string в паскале нумеруются не с 0, а с 1.
Цитата (disillusion):
Как это исправить?
Ну, например, выкинуть эту функцию нафиг (она у тебя даже результат не возвращает, а имя функции совпадает с именем локальной переменной) и воспользоваться стандартной IntToHex() из модуля SysUtils.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
disillusion (статус: Посетитель), 7 мая 2013, 08:59 [#2]:
<quote name=min@y™>Ну, например, выкинуть эту функцию нафиг (она у тебя даже результат не возвращает, а имя функции совпадает с именем локальной переменной) и воспользоваться стандартной IntToHex() из модуля SysUtils.</quote>
Мне не именно эта функция нужна. Мне нужны функции для работы с битами, чтобы можно было переводить из введенных символов в набор битов и делать XOR, AND, OR, NOT и легко отображать в строке менно последовательностью битов. Там роде бы есть нужные мне, чтобы попробовать использовать, мне нужно запустить модуль.
Самое интересное что в начале файла стоят копирайты, значит человек когда это все написал не раз его проверил и отдал в свободное пользование людям, а как можно было отдавать и подписывать не рабочий кусок кода.
Если у вас есть возможность посмотрите файл целиком, возможно там в чем-то другом проблема.
Спасибо за уделенное внимание моей проблеме.
|
|
min@y™ (статус: Доктор наук), 7 мая 2013, 09:19 [#3]:
Посмторел я модуль. Очень похоже, что он написал только для Delphi 1 (16-битной), где были короткие строки. Переделать, конечно, можно, но быстрее написать своё с нуля. К тому же в современных версиях Delphi большинство нужных тебе функций наверняка уже есть.
Какие функции конкретно тебе нужны? Могу попробовать написать, пока я добрый. У меня сегодня праздник.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 7 мая 2013, 09:23 [#4]:
Вот, выдрал из своей писанины. Может пригодится.
// Преобразование целого в двоичную строку и дополнение слева нулями до длины P
function Int2Bin(const X: Integer; const P: Byte): string;
var
i: Integer;
begin
Result:= '';
i:= X;
repeat
if (i and 1) = 0
then Result:= '0' + Result
else Result:= '1' + Result;
i:= i shr 1;
until i = 0;
while Length(Result) < P do
Result:= '0' + Result;
end;
// Преобразование байта в НЕХ
function Byte2Hex(const B: Byte): string;
begin
Result:= '0x' + IntToHex(B, 2);
end;
// Преобразование слова в НЕХ
function Word2Hex(const W: Word): string;
begin
Result:= '0x' + IntToHex(W, 4);
end;
// Преобразование двойного слова в НЕХ
function DWord2Hex(const D: DWord): string;
begin
Result:= '0x' + IntToHex(D, 8);
end;
// ------------------------- Логичекие функции ---------------------------------
// Чтение бита в байте
function GetBitInByte(const AByte, ABit: Byte): Boolean;
begin
Result:= AByte and (1 shl ABit) <> 0;
end;
// Установка бита в байте
function SetBitInByte(const AByte, ABit: Byte; const Value: Boolean): Byte;
begin
if Value
then Result:= AByte or (1 shl ABit)
else Result:= AByte and not (1 shl ABit);
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 7 мая 2013, 09:27 [#5]:
Вот тебе ещё простенький курсач на тему перевода чисел из одной системы счисления в другую (качай отсюдова).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
disillusion (статус: Посетитель), 7 мая 2013, 09:29 [#6]:
Спасибо большое. Вечером приду посмотрю.
p.s:
Мне нужно реализовать наглядную работу алгоритма хеширования Keccak. Для этого нужны ф-ции для работы с битами. Погуглив не нашел ничего подходящего - решил что встроенных нет, хотя звучит конечно странно 
И нужно учитывать то что я пользуюсь 7-ой версией Делфи. Возможно там еще не все было реализовано.
|
|
disillusion (статус: Посетитель), 7 мая 2013, 09:30 [#7]:
Благодарен Вам за помощь ^^
|
|
min@y™ (статус: Доктор наук), 7 мая 2013, 09:33 [#8]:
Цитата (disillusion):
Для этого нужны ф-ции для работы с битами.
Какие конкретно функции работы с битами тебе нужны?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
disillusion (статус: Посетитель), 7 мая 2013, 10:32 [#9]:
Пока что только думаю над будущей реализацией проекта.
То что на данный момент в голове - это:
- нужно перевести из символов в набор битов;
- с набором битов должно быть удобно работать (XOR, AND, OR, NOT) и при этом в любой момент времени чтобы было легко отобразить происходящие процессы на битовом уровне на любом шаге.
т.е. мне нужно еще определиться какой тип данных использовать для хранения преобразованных данных из String в последовательность битов, чтобы потом небыло трудно с ним работать для отображения сново в String.
Надеюсь понятно объяснил.
|
|
min@y™ (статус: Доктор наук), 7 мая 2013, 10:43 [#10]:
Цитата (disillusion):
Надеюсь понятно объяснил.
Нифига.
Нужны примеры входных данных и результатов их преобразования. Это я так, к слову.
А вообще, числа в цифровой технике хранятся и обрабатываются именно в двоичном виде (наборе битов), так что есть смысл в переводе "число ---> строка" только для отображения этих данных на экране. Побтиные операторы (XOR, AND, OR, NOT) допустимы для работы с любыми целыми типами данных (Byte, Word, DWord, Integer, (Int64?)).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
disillusion (статус: Посетитель), 7 мая 2013, 10:58 [#11]:
вот наглядное изображение того что предстоит делать
http://celan.informatik.uni-oldenburg.de/kryptos/info/keccak/absorb/
для начала вводится любая строка, потом каждый символ строки преобразуется в набор битов, для дальнейшей работы (перемешивания набора битов) с ними. И во время этого перемешивания мне нужно выводить на экран каждый происходящий шаг на битовом уровне.
|
|
disillusion (статус: Посетитель), 7 мая 2013, 11:25 [#12]:
например мы вводим слово "hello"
теперь преобразуем в набор битов
01101000 01100101 01101100 01101100 01101111
теперь к примеру сделаем hel XOR lo остальное недостающее заполним нулями
01101000 01100101 01101100
XOR
01101100 01101111 00000000
результат нужно отобразить символами.
Какой тип данных выбрать для хранения и какими ф-циями манипулировать пока что еще не знаю.
|
|
min@y™ (статус: Доктор наук), 7 мая 2013, 11:39 [#13]:
Цитата (disillusion):
http://celan.informatik.uni-oldenburg.de/kryptos/info/keccak/absorb/
Ну ты красавчик! Как узнал, что я немец? 
Цитата (disillusion):
потом каждый символ строки преобразуется в набор битов, для дальнейшей работы (перемешивания набора битов) с ними.
Ну и в чём проблема-то? Символ строки - это 8 бит (1 байт) если это обычная ASCII, ANSI и т.п. строка, 16 бит (2 байта), если, например, это кодировка unicode. Бывают ещё кодировки, если не ошибаюсь, с переменным количеством байт в символе (UTF-8, например).
Байты строки (её символы) тоже можно обрабатывать побитными операторами, применив преобразование типов Char ---> Byte ---> Char. Вот простой пример:
program p6421;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
Temp: string;
Index: Integer;
begin
Temp:= '12345_XYZ_COCACOLA';
WriteLn(Temp); // вывод строки
for Index:= 1 to Length(Temp) do
Temp[Index]:= Char(Byte(Temp[Index]) xor $30); // шифрую строку символом $30 ('0')
WriteLn(Temp); // вывод строки
ReadLn;
end.
Вот консоль программы:

Вывести каждый символ именно в двоичном виде на экран (например, символ '1' вывести как '00110001'), то функцию преобразования я тебе уже дал.
Или я чой-то не так понимаю?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 7 мая 2013, 11:42 [#14]:
Цитата (disillusion):
Какой тип данных выбрать для хранения и какими ф-циями манипулировать пока что еще не знаю.
Используй string для хранения текста, а для манипулирования её символами используй типы Char и Byte.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
disillusion (статус: Посетитель), 7 мая 2013, 11:48 [#15]:
спасибо. буду разбираться.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|