Войти

Показать полную графическую версию : Перекодировка из шестнадцатеричной в десятеричную систему


Alexey271
22-04-2011, 20:08
Здравствуйте!
Стоит задача чтения потока с терминала через com-порт и преобразования (математическое) их!
При чтении потоков с com-порта сигнал приходит в шестнадцатеричной системе.
Мне не хочется писать свою перекодирующую функцию, поэтому хотел бы узнать, есть ли более простой способ перекодирования шестнадцатеричного числа в десятеричное.

Структура посылки:
1 байт: знак "+" или "-"
2 - 9 байт: число
10 байт: символ "S"
11-18 байт: число
19-20 байт: № посылки

Пример полученных посылок

+00000000S00000000І±
+00000000S00000000ІІ
+00000000S00000000І3
+00000000S00000000Іґ
+00000000S00000000І5
+00000000S00000000І6
+00000000S00000000І·
+00000000S00000000Іё
+00000000S00000000І9
+00000000S0000000030
+00000000S000000003±
+00000000S000000003І
+00000000S0000000033
+00000000S000000003ґ
+00000000S0000000035
+00000000S0000000036
+00000000S000000003·
+00000000S000000003ё
+00000000S0000000039
+00000000S00000000ґ0
+00000000S00000000ґ±
+00000000S00000000ґІ
+00000000S00000000ґ3
+00000000S00000000ґґ
+00000000S00000000ґ5


1.P.S.
IntToHex() не сработал!

2.P.S.
Извиняюсь за свою неграмотность в программирование на С\C++, поэтому прошу при ответе написать подключаемую библиотеку и функцию перекодировки!

Спасибо!

El Scorpio
23-04-2011, 18:06
Мне не хочется писать свою перекодирующую функцию, поэтому хотел бы узнать, есть ли более простой способ перекодирования шестнадцатеричного числа в десятеричное. »
IntToHex() не сработал! »
Вообще-то перекодировка ИЗ шестнадцатеричной в десятичную называется HexToInt :)

Alexey271
24-04-2011, 18:43
Вообще-то перекодировка ИЗ шестнадцатеричной в десятичную называется HexToInt »

El Scorpio
Спасибо, конечно! Но не срабатывает у меня "HEX" почему-то!
Скинь исходники, где у тебя работает **ToHex() или HexTo***()!

El Scorpio
25-04-2011, 01:51
Alexey271, увы, давно ничего не кодил :(
Возможно, там нужно передать строку определённой длины?

Alexey271
25-04-2011, 03:02
Alexey271, увы, давно ничего не кодил
Возможно, там нужно передать строку определённой длины? »

El Scorpio
Я имел ввиду обычных 2 Edit и Button, где будет перекодировка из 16-ричной в 10-ричную!
Сам не пойму в чем дело, то ли в типах данных, то ли в длине, как ты сказал!

Alexey271
25-04-2011, 09:54
El Scorpio
Решил задачу в "лоб", как говориться!
Есть идейки, как упростить или улучшить код?!

//#################################// /* ПЕРЕВОД ИЗ 16 В 10 */ //#################################//
Simbol2[0] = 0;
Simbol2[1] = 1;
Simbol2[2] = 2;
Simbol2[3] = 3;
Simbol2[4] = 4;
Simbol2[5] = 5;
Simbol2[6] = 6;
Simbol2[7] = 7;
Simbol2[8] = 8;
Simbol2[9] = 9;
Simbol2[10] = "a";
Simbol2[11] = "b";
Simbol2[12] = "c";
Simbol2[13] = "d";
Simbol2[14] = "e";
Simbol2[15] = "f";

Simb2[0] = 0;
Simb2[1] = 1;
Simb2[2] = 2;
Simb2[3] = 3;
Simb2[4] = 4;
Simb2[5] = 5;
Simb2[6] = 6;
Simb2[7] = 7;
Simb2[8] = 8;
Simb2[9] = 9;
Simb2[10] = 10;
Simb2[11] = 11;
Simb2[12] = 12;
Simb2[13] = 13;
Simb2[14] = 14;
Simb2[15] = 15;

b2 = LabeledEdit4->Text; j=b2.Length(); //функция возвращает количество символов в строке
j=j-1; //отнимаем единицу для перевода в десятиричную систему
//Вносим в массив символы строки
//Start//
for(i=1; i<=j+1; i++) {
Simbol[i]=b2.SubString(i,1);// функция выделяет 1 симолов, начиная с i из строки b2 }
//End//
//Присваиваем массиву числовые значения 16-ти ричной кодировки //Start// for(i=1; i<=j+1;i++) { for(k=0; k<=16;k++) { if(Simbol[i]==Simbol2[k]) { Simb[i] = Simb2[k]; //ShowMessage(Simb2[k]); } } }
//End//
//Перевод чисел из 16 в 10
//Start// code10 = 0; // на всякий случай обнуляем
for(i=1; i<=j+1;i++) {
if(i==1) { code10+= Simb[j+1]; } else { //возведение в степень числа 16 int S16 = 0; // на всякий случай обнуляем
for(k=1; k<i; k++) { if(k==1){S16+=16;} // else{S16=S16*16;} // } code10+= Simb[j+2-i]*S16; } } //End// LabeledEdit3->Text = code10; // запись полученного значения Edit

P.S.
IntToHex() - Работает
HexToInt() - не определена (не работает)




© OSzone.net 2001-2012