Dekodowanie liczby Hex

0

Witam

Szukam pomocy w rozwiązaniu takiego problemu.
Komunikuję się z pewnym urządzeniem po rs232. Po wydaniu zapytania urządzenie odpowiada. Tutaj nie ma problemu.
W odpowiedzi dostaję dane.

0x451B0000 

Gdy wyświetlam liczbę 45

 Edit1->Text=Buffer_I[0]

Dostaję wartość 69 a chciałbym dostać wartość 4

Rozumiem że jest to związane z danymi które przychodzą z urządzenia,są w postaci zlepionej dane z adresu Buffer_I[0] = 45, Buffer_I[1] = 1B
Moje pytanie czy istnieje jakieś rozwiązanie które by pozwalało rozdzielić tą liczbę na pojedyncze liczby. Abym mógł wyświetlić każdą z osobna.

0

Nie, twój problem polega na tym że chyba nie bardzo wiesz co to za kodowanie znaków. Bo 45h czyli 69 to jest E w ascii wiec wiemy już że ascii to to nie jest. Więc pytanie brzmi: jak te dane są kodowane?

1

Jak chcesz dostać z szesnastkowej liczby 45 liczbę 4? Przecież 45h == 69d.
Wyświetl buffer[0] >> 4 (czyli górne cztery bity przesunięte na miejsce czterech dolnych), potem buffer[0] & 0xf (czyli dolne cztery bity z wyzerowanymi czterema górnymi) i tak dalej dla kolejnych elementów bufora.

0

Dzięki za wskazówki wiem że liczba

0x541B0000 to 6981

I potrzebne jest mi to właśnie do zdekodowania.

0

no fajnie ze potrzebujesz to zdekodowac, ale czym bylo to zakodowane. Bez tej wiedzy nie jestes wstanie zdekodowac.

Wyoraz sobie to tak, ze nazywam wszystkie rzeczy inaczej (kodowanie). Jezeli Ci nie powiem reguly to nie bedziesz potrafil zrozumiec o czym mowie (nie bedziesz potrafil dekodowac tego)

0

Tylko jedna liczba Ci przychodzi w odpowiedzi?

0

Z dokumentacji wynika ze kodowanie to

 4 bytes BCD

Liczba jaka przychodzi w formie hex

451B0000

Z wyświetlacza wiem ze jest 6981

Pomyślałem sobie że ta liczbę zapiszę tak

00001B45 

i zdekoduję

1

nie wygląda mi to na BCD ze względu na "B" w drugim bajcie, co musiało by reprezentować nieistniejącą w zapisie decymalnym cyfrę 'jedenascie'

0

1B45h == 6981d, no rocket science. Liczba jest zapisana w formie little endian, czyli mniej znaczące bajty są na początku, jednocześnie mniej znaczące słowa również są na początku, co de facto oznacza, że bajty są ułożone od tyłu. To natywna forma zapisu bajtów dla x86 (https://pl.wikipedia.org/wiki/Kolejno%C5%9B%C4%87_bajt%C3%B3w), więc de facto oznacza to, że te cztery bajty bufora możesz zrzutować na longa i będziesz mieć od razu pożądaną liczbę.

0

Spróbowałem teraz inne urządzenie i tam jest już inaczej.

z odebranych danych mam liczbę.

00105794 co odpowiada na wyświetlaczu 105,794
Nie potrafię jej jednak wyświetlić w c++ builder w polu Edit1

Robię tak

		gj6b=(ramka2[28]>>4);  	//9
		gj7b=(ramka2[28]&0xf); 	//4

		gj4b=(ramka2[27]>>4); 	//5
		gj5b=(ramka2[27]&0xf);   //7

		gj2b=(ramka2[26]>>4);    //1
		gj3b=(ramka2[26]&0xf);   //0

		gj0b=(ramka[25]>>4);      //0
		gj1b=(ramka[25]&0xf);     //0



		wynik_gj+=gj0b+=gj1b+=gj2b=+gj3b+=gj4b+=gj5b+=gj6b+=gj7b;
//		wynik_gj+=gj1b;
//		wynik_gj+=gj2b;
//		wynik_gj+=gj3b;
//		wynik_gj+=gj4b;
//		wynik_gj+=gj5b;
//		wynik_gj+=gj6b;
//		wynik_gj+=gj7b;

		wynik_gj1b = wynik_gj;


Następnie w timerze chce wyświetlić ta liczbę.

Edit1->Text=wynik_gj1b/100; 

Ale przy uruchomieniu programu w polu Edit1 wyświetla się 25 i zwiększa się co 100% przy każdym wywołaniu timera.

Moje pytanie jak mogę połączyć i wyświetlić te liczby aby w zmiennej wynik_gj1b była liczba 00105794

1
wynik_gj=to_string(gj0b)+to_string(gj1b)+to_string(gj2b)+to_string(gj3b)+to_string(gj4b)+"."+to_string(gj5b)+to_string(gj6b)+to_string(gj7b);
0

Dzięki za pomoc działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1