| 
| 
 | Вопрос # 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]:спасибо. буду разбираться. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |