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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2014, 03:07   #1
Zadovatel
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 46
По умолчанию PDUtoAnsi

Всем привет.Написал функцию,которая распаковывает PDU строку.Вот тут представлен алгоритм:http://www.ixbt.com/mobile/review/comp-sms.shtml.
Все бы прекрасно,да только есть 2 проблемы.
1)Совершенно по не ясным для меня причинам моя функция нагло ворует каждый 8-й символ.Например ,должна быть строка:123456789123456789123,а будет:1234567912345679123.Ковыряюсь уже часов 6 и причина не найдена.
2)Есть подозрения,что связано с первой проблемой.При жирных SMS клиент просто закрывается.
Всем откликнувшимся-большое спасибо.
P.S.Да,говнокод.Но я и не программирую уже давно
Код:
function PDUtoAnsi(Str: String): String;
 var
 Buf   : PByteArray;
 buf_size : integer;
 k,i,c:integer;
 Bpos,Nbyte:integer;
 First,Second:byte;
 begin
 buf_size:=Length(Str);
 GetMem(Buf,Length(Str));
 k:= Length(Str);
 //Çàïîëíÿåì áóôåð
  for i:=0 to Length(Str)-1 do
  begin
  Buf[i]:= Ord(Str[k]);
  dec(k);
  end;
  //Ðàñïàêîâûâàåì.
  k:=1;
  Bpos:=1;
  Nbyte:=Length(Str)-1;
  Second:=0;
  c:=1;
  for i:=0 to StrToInt('$'+MySMS.UDL)-1 do
  begin
  if Bpos = 8 then
  begin
  Bpos:=1;
  c:=1;
  end;
  First:= Buf[Nbyte] shl Bpos;
  if Bpos = 1 then
  begin
    Second:=0;
    First:= First shr Bpos;
    end
  else
  First:= First shr (Bpos-c);
  Str[k]:= chr(First+Second);
  Second:= Buf[Nbyte] shr (8-Bpos);
  inc(Bpos);
    if Bpos > 2 then inc(c);
  dec(Nbyte);
  inc(k);
  end;
  FreeMem(Buf,buf_size);
 Result := Str;
 end;
Переменная MySMS.UDL -количесто символов в 16-ричной системе(не байт!),строковая.Пример:MySMS.UDL=' A0'.
Zadovatel вне форума Ответить с цитированием
Старый 25.03.2014, 15:47   #2
Zadovatel
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 46
По умолчанию

Немного привел код в более читаемый вид.Баги те же
Код:
 function PDUtoAnsi(Str: String;CharCount: Dword): String;
 var
 Buf   : PByteArray;
 i:integer;
 Bpos,Nbyte:integer;
 First,Second:byte;
 begin
 GetMem(Buf,Length(Str));
 //Заполняем буфер
 for i:=0 to (Length(Str)-1) do Buf[i]:=Ord(Str[Length(Str)-i]);
  //Распаковываем.
  Bpos:=1;
  Nbyte:=Length(Str)-1;
  for i:=0 to CharCount-1 do
  begin
  if Bpos = 8 then Bpos:=1;
  First:= Buf[Nbyte] shl Bpos;
  if Bpos = 1 then
  begin
    Second:=0;
    First:= First shr Bpos;
    end
  else
    First:= First shr (Bpos-Pred(Bpos));
  Str[i+1]:= chr(First+Second);
  Second:= Buf[Nbyte] shr (8-Bpos);
  inc(Bpos);
  dec(Nbyte);
  end;
 FreeMem(Buf,SizeOf(Buf));
 Result := Str;
 end;

Последний раз редактировалось Zadovatel; 25.03.2014 в 16:01.
Zadovatel вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск