Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Программа для перевода септетов в октеты

Непрочитано 30.06.2010, 21:59  
begun
Гражданин KAZUS.RUN
 
Регистрация: 18.07.2006
Сообщений: 894
Сказал спасибо: 244
Сказали Спасибо 31 раз(а) в 28 сообщении(ях)
begun на пути к лучшему
По умолчанию Программа для перевода септетов в октеты

здравствуйте!
В сигнализакиях МК+МОБ для отправки SMS врежиме PDU символы из 7-ми битной кодировки переводят в 8- ми битной по известному алгоритму.
Нет ли у кого программы на СИ или VB6 промзводящий такую перекодировку?
Заранее благодарен.
Реклама:
begun вне форума  
Непрочитано 01.07.2010, 03:01  
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,394
Сказал спасибо: 2,016
Сказали Спасибо 1,356 раз(а) в 591 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: Программа для перевода септетов в октеты

Сообщение от begun Посмотреть сообщение
Нет ли у кого программы на СИ или VB6 промзводящий такую перекодировку?
Когда-то делал программы на Дельфях, перекодировка туда и обратно. Давно правда, но вроде работало. Погляжу завтра - на рабочем компе лежит, надеюсь, не похерил.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
nml вне форума  
Непрочитано 01.07.2010, 12:13  
raxp
Почётный гражданин KAZUS.RUN
 
Регистрация: 28.05.2010
Сообщений: 1,117
Сказал спасибо: 150
Сказали Спасибо 604 раз(а) в 310 сообщении(ях)
raxp на пути к лучшему
По умолчанию Re: Программа для перевода септетов в октеты

на си...
Код:
char cnv(char* s) // to MODNUM
{
	unsigned char i = 2;
	char temp;

	if (strlen(s)!= 13) {s[strlen(s)+1] = s[strlen(s)] + "F";}
	while (i‹strlen(s)+1)
	 {
		temp = temp + s[i+1] + s[i];
  		i++; i++;
	 }
	 return temp;
}

char cnv2(char* s) // to UCS2
{
	unsigned char i,k;
	char temp;
	for(i=1; i‹strlen(s); i++)
	 {
 		k = s[i]; //k = strchr(s, i); - выбрать i-й символ из строки s //char *k; static char s[] = "nrtfbae",
  		if (k › 0xC0)|(k == 0xC0)
		{
			k = k + 0x410 - 0xC0;
		} 
		temp = temp + k;
	 }
	return temp;  
}

char cnv3(char* s) // to UCS2
{
	char simv[] = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧ  ШЩЬЪЭЮЯабвгдеёжзийклмнопр  стуфхцчшщэюяABCDEFGHIJKLMNOPQRSTUVWXYZ  abcdefghijklmnopqrstuvwxyz0123456789"-* "; // строка
	char temp;

//	for (i=1; i‹strlen(s); i++) {temp = temp + ucs[strstr(simv, s[i])];}
	return temp;
}
char* cpdu(char sz,char num,char msg) // to PDU
{
	char* temp = '07' +         //07=06 для номера SMSC + 1 байт интернациональности SMSC
          		 '91' +          //91=интернациональность SMSC
          		 cnv(sz) +       //97103701F0=+790173100 плюс признак окончания номера F
          		 '01' +          //01=PDU Type: MTI=01 -› исходящий SMS
          		 '00' +          //00=MR - параметр, который устанавливается в SMSC
          		 strlen(num)-1 + //0B=длина номера получателя-1 (10 знаков в номере)
          		 '91' +          //91=интернациональность получателя
          		 cnv(num) +      //9710276338F6=+79017236836 - номер получателя
          		 '00' +          //00=PID идентификатор номера протокола
          		 '08' +          //08=DCS схема кодирования данных: кириллическое сообщение
          		 strlen(msg)*2 + //02=длина сообщения
          		 cnv2(msg);      //0410=сообщение: "А"
	return temp;
}
на delphi...
Код:
unit pdu7bits;

interface

function EncodePDU7bits(const Source: String): String;
function DecodePDU7bits(const CodedStr: String): String;

implementation

procedure Bin2Hex(Buffer, Text: PChar; BufSize: Integer); assembler;
const
  Convert: array[0..15] of Char = '0123456789ABCDEF';
  p: array[1..7] of Byte = ($1, $3, $7, $F, $1F, $3F, $7F);
var
  i, Count: Integer;
  c, Tmp, r: Byte;
begin
  r:= Byte(Buffer[0]);
  Count:= 1;
  for i := 0 to BufSize - 1 do
    if Count ‹ 8 then
    begin
      c:= r;
      if i ‹ (BufSize - 1) then
      begin
        Tmp:= Byte(Buffer[I + 1]);
        r:= Tmp shr Count;
        c:= c or ((Tmp and p[Count]) shl (8 - Count));
        Inc(Count);
      end;
      Text[0] := Convert[c shr 4];
      Text[1] := Convert[c and $F];
      Inc(Text, 2);
    end
    else
    begin
      Count:= 1;
      if i ‹ BufSize then
        r:= Byte(Buffer[i + 1]);
    end;
end;
      
function Hex2Bin(Text, Buffer: PChar; BufSize: Integer): Integer; assembler;
const
  Convert: array['0'..'f'] of SmallInt =
    ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
     -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,10,11,12,13,14,15);

  p: array[1..7] of Byte = ($7F, $3F, $1F, $F, $7, $3, $1);

var
  i, Count: Integer;
  Tmp, c, r: Byte;
begin
  I := BufSize;
  Count:= 1;

  while i › 0 do
  begin
    if not (Text[0] in ['0'..'f']) or not (Text[1] in ['0'..'f']) then Break;

    c:= (Convert[Text[0]] shl 4) + Convert[Text[1]];
    tmp:= c shr (8 - Count);
    c:= c and p[Count];

    if Count › 1 then
      c:= (c shl (Count - 1)) or r;

    r:= Tmp;
    Buffer[0] := Char(c);

    if Count = 7 then
    begin
      Inc(Buffer);
      Buffer[0] := Char(r);
      Count:= 1;
    end
    else
      Inc(Count);

    Inc(Buffer);
    Inc(Text, 2);
    Dec(i);
  end;
  Result := BufSize - i;
end;   

function EncodePDU7bits(const Source: String): String;
var Leng: Integer;
begin
  Leng:= Length(Source);
  Leng:= (Leng * 2)- ((Leng div 8) * 2);
  SetLength(Result, Leng);
  Bin2Hex(PChar(Source), PChar(Result), Length(Source));
end;

function DecodePDU7bits(const CodedStr: String): String;
var Leng: Integer;
begin
  Leng:= Length(CodedStr) div 2;
  SetLength(Result, Leng+ (Leng div 7));
  Hex2Bin(PChar(CodedStr), PChar(Result), Leng);
end;

end.[/QUOTE]

или так:
[QUOTE]function cnv(s: string):string;
var i: integer;
begin
 delete(s,1,1);
 if length(s) mod 2›0 then s:=s + 'F';
 i:= 1;
 while (i‹length(s)+1) do begin
  result:= result + s[i+1]+s[i];
  inc(i);inc(i)
 end
end;
function ucs2(s: string): string;
var i,k: integer;
begin
 for i:=1 to length(s) do begin
  k:= ord(s[i]);
  if k›=192 then k:= k + 1040 - 192;
  result:= result + inttohex(k,4)
 end
end;
function tcod: string;
begin
 if pduf.fsms.Checked then result:= 'F8'
  else result:= '08'
end;
function cpdu(ksz,sz,num,msg: string): string;
begin
 result:= inttohex(length(sz),2) +      // 07=длина номера SMSC
          '91' +                        // 91=интернациональность номера SMSC
          cnv(ksz + sz) +               // 97103701F0=+790173100 плюс признак окончания номера F
          '01' +                        // 01=PDU Type: MTI=01 -› исходящий SMS
          '00' +                        // 00=MR - параметр, который устанавливается в SMSC
          inttohex(length(num)-1,2) +   // длина номера получателя-1
          '91' +                        // 91=интернациональность получателя
          cnv(num) +                    // 9710276338F6=+79017236836 - номер получателя
          '00' +                        // 00=PID идентификатор номера протокола
          tcod +                        // F8/08=DCS схема кодирования на экран/вну: кириллическое
          inttohex(length(msg)*2,2)+    // длина сообщения
          ucs2(msg)                     // сообщение
end;

procedure Tpduf.tpduClick(Sender: TObject);
begin
 if (sz.Text='')and(ksz.Text='') then caption:= '  !!! номер центра будет взят из SIM'
  else caption:= '  PDU conversion TEST [Siemens C-35]';
 pdu.Text:= cpdu(ksz.Text, sz.Text,num.Text, txt.Text)
end;
Миниатюры:
Нажмите на изображение для увеличения
Название: picture1.jpg
Просмотров: 50
Размер:	98.8 Кб
ID:	9379   Нажмите на изображение для увеличения
Название: picture6.jpg
Просмотров: 55
Размер:	20.2 Кб
ID:	9380   Нажмите на изображение для увеличения
Название: picture6.2.png
Просмотров: 56
Размер:	10.5 Кб
ID:	9381  

Вложения:
Тип файла: pdf PDU это просто. Система оповещения GSM (Минск).pdf (460.0 Кб, 336 просмотров)
Тип файла: zip тестовый конвертор и компиляция.zip (171.4 Кб, 123 просмотров)
Тип файла: pdf формат SMS-PDU.pdf (22.0 Кб, 102 просмотров)
__________________
Белорусский журнал «Радиолюбитель»
Youtube LaboratoryW
UR3QQJ
raxp вне форума  
Сказали "Спасибо" raxp
begun (02.07.2010)
Непрочитано 01.07.2010, 12:56  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: Программа для перевода септетов в октеты

Сообщение от begun Посмотреть сообщение
здравствуйте!
В сигнализакиях МК+МОБ для отправки SMS врежиме PDU символы из 7-ми битной кодировки переводят в 8- ми битной по известному алгоритму.
Нет ли у кого программы на СИ или VB6 промзводящий такую перекодировку?
Заранее благодарен.
Вроде в любом ..никсе есть проги UUencode+UUdecode. Исходники фришные, на каждом углу.
ut1wpr вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импульсная зарядка для авто-аккумуляторов (новодел) Falconist Источники питания и свет 1915 14.03.2024 19:56
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
Linux-ваше мнение Tvenn Делимся опытом 6169 23.08.2015 08:57
Все что нужно для начала работы с микроконтроллерами incm Микроконтроллеры, АЦП, память и т.д 157 31.10.2011 20:12


Часовой пояс GMT +4, время: 03:30.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.