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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 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 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: disillusion (статус: Посетитель)
Вопрос отправлен: 6 мая 2013, 21:44
Состояние вопроса: открыт, ответов: 0.


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

Всего сообщений: 15; последнее сообщение — 7 мая 2013, 11:48; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 7 мая 2013, 08:13 [#1]:

Цитата (disillusion):

выдает ошибку при записи в нулевой бит

Символы строк типа string в паскале нумеруются не с 0, а с 1.

Цитата (disillusion):

Как это исправить?

Ну, например, выкинуть эту функцию нафиг (она у тебя даже результат не возвращает, а имя функции совпадает с именем локальной переменной) и воспользоваться стандартной IntToHex() из модуля SysUtils.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
disillusion

disillusion (статус: Посетитель), 7 мая 2013, 08:59 [#2]:

<quote name=min@y™>Ну, например, выкинуть эту функцию нафиг (она у тебя даже результат не возвращает, а имя функции совпадает с именем локальной переменной) и воспользоваться стандартной IntToHex() из модуля SysUtils.</quote>

Мне не именно эта функция нужна. Мне нужны функции для работы с битами, чтобы можно было переводить из введенных символов в набор битов и делать XOR, AND, OR, NOT и легко отображать в строке менно последовательностью битов. Там роде бы есть нужные мне, чтобы попробовать использовать, мне нужно запустить модуль.
Самое интересное что в начале файла стоят копирайты, значит человек когда это все написал не раз его проверил и отдал в свободное пользование людям, а как можно было отдавать и подписывать не рабочий кусок кода.

Если у вас есть возможность посмотрите файл целиком, возможно там в чем-то другом проблема.

Спасибо за уделенное внимание моей проблеме.
min@y™

min@y™ (статус: Доктор наук), 7 мая 2013, 09:19 [#3]:

Посмторел я модуль. Очень похоже, что он написал только для Delphi 1 (16-битной), где были короткие строки. Переделать, конечно, можно, но быстрее написать своё с нуля. К тому же в современных версиях Delphi большинство нужных тебе функций наверняка уже есть.
Какие функции конкретно тебе нужны? Могу попробовать написать, пока я добрый. :) У меня сегодня праздник.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

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™

min@y™ (статус: Доктор наук), 7 мая 2013, 09:27 [#5]:

Вот тебе ещё простенький курсач на тему перевода чисел из одной системы счисления в другую (качай отсюдова).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
disillusion

disillusion (статус: Посетитель), 7 мая 2013, 09:29 [#6]:

Спасибо большое. Вечером приду посмотрю.
p.s:
Мне нужно реализовать наглядную работу алгоритма хеширования Keccak. Для этого нужны ф-ции для работы с битами. Погуглив не нашел ничего подходящего - решил что встроенных нет, хотя звучит конечно странно :)
И нужно учитывать то что я пользуюсь 7-ой версией Делфи. Возможно там еще не все было реализовано.
disillusion

disillusion (статус: Посетитель), 7 мая 2013, 09:30 [#7]:

Благодарен Вам за помощь ^^
min@y™

min@y™ (статус: Доктор наук), 7 мая 2013, 09:33 [#8]:

Цитата (disillusion):

Для этого нужны ф-ции для работы с битами.

Какие конкретно функции работы с битами тебе нужны?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
disillusion

disillusion (статус: Посетитель), 7 мая 2013, 10:32 [#9]:

Пока что только думаю над будущей реализацией проекта.
То что на данный момент в голове - это:
- нужно перевести из символов в набор битов;
- с набором битов должно быть удобно работать (XOR, AND, OR, NOT) и при этом в любой момент времени чтобы было легко отобразить происходящие процессы на битовом уровне на любом шаге.
т.е. мне нужно еще определиться какой тип данных использовать для хранения преобразованных данных из String в последовательность битов, чтобы потом небыло трудно с ним работать для отображения сново в String.
Надеюсь понятно объяснил.
min@y™

min@y™ (статус: Доктор наук), 7 мая 2013, 10:43 [#10]:

Цитата (disillusion):

Надеюсь понятно объяснил.

Нифига.
Нужны примеры входных данных и результатов их преобразования. Это я так, к слову.
А вообще, числа в цифровой технике хранятся и обрабатываются именно в двоичном виде (наборе битов), так что есть смысл в переводе "число ---> строка" только для отображения этих данных на экране. Побтиные операторы (XOR, AND, OR, NOT) допустимы для работы с любыми целыми типами данных (Byte, Word, DWord, Integer, (Int64?)).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
disillusion

disillusion (статус: Посетитель), 7 мая 2013, 10:58 [#11]:

вот наглядное изображение того что предстоит делать
http://celan.informatik.uni-oldenburg.de/kryptos/info/keccak/absorb/
для начала вводится любая строка, потом каждый символ строки преобразуется в набор битов, для дальнейшей работы (перемешивания набора битов) с ними. И во время этого перемешивания мне нужно выводить на экран каждый происходящий шаг на битовом уровне.
disillusion

disillusion (статус: Посетитель), 7 мая 2013, 11:25 [#12]:

например мы вводим слово "hello"
теперь преобразуем в набор битов
01101000 01100101 01101100 01101100 01101111
теперь к примеру сделаем hel XOR lo остальное недостающее заполним нулями
01101000 01100101 01101100
XOR
01101100 01101111 00000000
результат нужно отобразить символами.
Какой тип данных выбрать для хранения и какими ф-циями манипулировать пока что еще не знаю.
min@y™

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™

min@y™ (статус: Доктор наук), 7 мая 2013, 11:42 [#14]:

Цитата (disillusion):

Какой тип данных выбрать для хранения и какими ф-циями манипулировать пока что еще не знаю.

Используй string для хранения текста, а для манипулирования её символами используй типы Char и Byte.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
disillusion

disillusion (статус: Посетитель), 7 мая 2013, 11:48 [#15]:

спасибо. буду разбираться.

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 19 августа 2019, 22:18
Выполнено за 0.02 сек.
Рейтинг@Mail.ru