Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2012, 15:57   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
Счастье Двоичный код в строку

Доброго времени суток!

Пишу простенький клиент-сервер на основе сокетов.
Сообщения кодирую в бинарный код(1 и 0).

Написал для этого процедуру:
Код:
function Str2Bin(aStr: string): string;
type
  TBitsPerChar = 1..8;
var
  iChar, iBit: Integer;
  s: string;
begin
  s := aStr;
  for iChar := 1 to Length(s) do
    for iBit := High(TBitsPerChar) downto Low(TBitsPerChar) do
      Result := Result + IntToStr((Byte(s[iChar]) shr (iBit - 1)) and 1)[1];
end;
Буква F => 01000110

Попробовал перевернуть функцию т.к. ничего более в голову не пришло:
Код:
function Bin2Str(aStr: string): string;
type
  TBitsPerChar = 1..8;
var
  iChar, iBit: Integer;
  s: string;
begin
  s := aStr;
  for iChar := Length(s) downto 1 do
    for iBit := Low(TBitsPerChar)  to High(TBitsPerChar) do
      Result := Result + IntToStr((Byte(s[iChar]) shl (iBit + 1)) and 0)[1];
end;
Как раскодировать текст?

ОБНОВЛЕНО
Вопрос отвалился, придумал решение.

Написал декодер:
Код:
function Bin2Str(aStr: string): string;
var
  s: string;
  iChar,i: Integer;
  rs: string;
begin
  iChar:=0;
  i:=0;
  result := '';
  s := aStr;
  while Length(s) > 0 do
  begin
  iChar:=0; //re init
    if Length(s) < 8 then
      Break;
    for i := 1 to 7 do
    begin
      iChar := (iChar + ord(s[i]) - 48) shl 1;
    end;
    rs := rs + Chr(iChar);
    Delete(s, 1, 7);
  end;
  Result := rs;
end;
F => 01000110
01000110 => F

А вот толпу текста перводит, но не так как нужно.

С русским алфовитом ни кодер, ни декодер не рулит, в чем соль?

Последний раз редактировалось Человек_Борща; 23.06.2012 в 16:25.
Человек_Борща вне форума Ответить с цитированием
Старый 23.06.2012, 19:16   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

А по сколько символов Вы отводите на 1 байт?
В декодере, вроде, по 7 (цикл от 1 до 7).
s-andriano вне форума Ответить с цитированием
Старый 23.06.2012, 21:09   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

1 символ = 1 Байту = 8 битам.
Строку вроде как с 1 начинают отсчитывать т.к. s[0] выводит весь массив(строка полностью).
Если с 0 и до 7, то не то возвращает, если от 1 и до 8, то тоже не то.

Длинну проверял. H => 01 00 10 00 = 4 битам или 8 символам в рез-те.
Hello(5 знаков) => 01 00 10 00 01 10 01 01 01 10 11 00 01 10 11 00 01 10 11 11 = 20 битам или 40 знакам в рез-те.

А вот из этих 40 бит, выводит это: Hdlln, а должно Hello.

Как быть с русским алфавитом, вообще труба.

Последний раз редактировалось Человек_Борща; 23.06.2012 в 21:27.
Человек_Борща вне форума Ответить с цитированием
Старый 23.06.2012, 21:42   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А что за блажь в битовое представление? В hex будет в четыре раза короче. А в BASE64 еще короче. И все таки битов 8, а не 7
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.06.2012, 22:17   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
А что за блажь в битовое представление?
Не понял*

Код:
В hex будет в четыре раза короче. А в BASE64 еще короче.
Знаю, но 2-ой кодировкой надо, так хочет заказчик.

Цитата:
И все таки битов 8, а не 7
Думаете не пробовал? Перебрал всевозможные варианты.

Код:
function Bin2Str(aStr: string): string;
var
  s: string;
  iChar,i: Integer;
  rs: string;
begin
  iChar:=0;
  i:=0;
  result := '';
  s := aStr;
  while Length(s) > 0 do
  begin
  iChar:=0; //re init
    if Length(s) < 8 then
      Break;
    for i := 1 to 8 do
    begin
      iChar := (iChar + ord(s[i]) - 48) shl 1;
    end;
    rs := rs + Chr(iChar);
    Delete(s, 1, 8);
  end;
  Result := rs;
end;
F => 01000110
01000110 => Њ

Нет, уже и с одной буквой не работает.
Человек_Борща вне форума Ответить с цитированием
Старый 23.06.2012, 22:26   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
1 символ = 1 Байту = 8 битам.
Еще раз обращаю Ваше внимание, что в декодере используется цикл от 1 до 7.
Цитата:
Hello(5 знаков) => 01 00 10 00 01 10 01 01 01 10 11 00 01 10 11 00 01 10 11 11 = 20 битам или 40 знакам в рез-те.
Сам кода, вроде верный, следовательно, ошибка в декодере.
Хотя, что такое "20 битам или 40 знакам", я не понимаю.
Цитата:
А вот из этих 40 бит, выводит это: Hdlln, а должно Hello.

Как быть с русским алфавитом, вообще труба.
Когда найдете ошибку (а мне кажется, я Вам на нее указал), кириллица будет работать так же, как и латиница.

PS. По поводу того, что Вы с самого начала делаете что-то не то (т.е. увеличиваете для передачи объем данных в 8 раз), вполне согласен с Аватаром.
s-andriano вне форума Ответить с цитированием
Старый 23.06.2012, 22:32   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Хотя, что такое "20 битам или 40 знакам", я не понимаю.
1 бит это, ну как вам сказать... или так: 00 или так: 01 (в двоичной системе). Откройте HEX редактором(там 16-титричная) что угодно, увидите биты.
В слове Hello 20 раз по 2.

Код:
Еще раз обращаю Ваше внимание, что в декодере используется цикл от 1 до 7.
Постом выше привел код с вашим вариантом цикла, результат там же.

Цитата:
PS. По поводу того, что Вы с самого начала делаете что-то не то (т.е. увеличиваете для передачи объем данных в 8 раз), вполне согласен с Аватаром.
Я об этом знаю. Заказчику нужно именно это.

Проверил! Декодер работает нормально, ну или мне так кажется.
лат. символ e => 01100101
01100101 => d



Проблему решил сдвигом iChar вправо на 1 бит, после выполнения цикла, и передачей символа в строку.
Цикл от 1 до 8.

Последний раз редактировалось Человек_Борща; 23.06.2012 в 22:48.
Человек_Борща вне форума Ответить с цитированием
Старый 23.06.2012, 22:39   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
//      iChar := (iChar + ord(s[i]) - 48) shl 1;
      iChar := (iChar shl 1)+ ord(s[i]) - 48;
И цикл само собой от 1 до 8
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.06.2012, 22:49   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Аватар, хм а я iChar shr 1 после цикла вставил и тоже работает.
В чем фокус? Вроде от перемены мест сумма не меняется...

Update
Дошло.

Последний раз редактировалось Человек_Борща; 23.06.2012 в 22:52.
Человек_Борща вне форума Ответить с цитированием
Старый 23.06.2012, 22:50   #10
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

что-то накидал на скорую руку:
Код:
function Str2Bin(aStr: string): string;
const bid : array[0..1]of char = ('0','1');
var
  iChar, iBit: Integer;
  s: string;
begin
  s := '';
  for iChar := 1 to Length(aStr) do
    for iBit := 7 downto 0 do
      s := s + bid[(Byte(aStr[iChar]) shr iBit) and 1];
  Str2Bin := s;
end;

function Bin2Str(aStr: string): string;
var
  s: string;
  i,j,k : longint;
  ich : integer;
begin
  s := '';
  k := 1;
  for i := 1 to length(aStr) div 8 do begin
    ich := 0;
    for j := 0 to 7 do begin
      ich := ich*2 + byte(aStr[k]) - byte('0');
      inc(k);
    end;
    s := s + char(ich);
  end;
  Bin2Str := s;
end;

var
  s0,s1,s2 : string;
begin
  s0 := 'Hello';
  s1 := Str2Bin(s0);
  s2 := Bin2Str(s1);
  writeln('[',s0,'][',s1,'][',s2,']');
end.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перевод в ASCII код и в двоичный код Randy.Mandy Microsoft Office Excel 0 27.02.2012 21:40
двоичный код vereney Паскаль, Turbo Pascal, PascalABC.NET 0 30.03.2011 19:42
двоичный код Иван 666 Помощь студентам 9 15.07.2010 08:52
двоичный код Артэс Общие вопросы C/C++ 2 20.05.2010 19:15
Двоичный код masterx13 Паскаль, Turbo Pascal, PascalABC.NET 4 14.11.2007 20:08