logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Konwersja liczby szesnastkowej na dwa znaki ASCII

Krokus22 27 Lis 2011 17:27 2389 10
  • #1 10189529
    Krokus22
    Poziom 19  
    Witam, siedzę już długo nad kodem i mam następujący problem.
    Posiadam w pamięci programu zmienna typu unsigned char, reprezentuje ona pewną wartość szesnastkową. Potrzebuję przekonwertować ją na dwa znaki ASCII. To znaczy:

    Jest ciag w pamieci:
    0x11 0x03 0x00 0x6B 0x00 0x03

    Rozbijamy go na czesci:
    1 1 0 3 0 0 6 B 0 0 0 3 7 E

    I zamieniamy na ASCII:
    3131 3033 3030 3642 3030 3033 3745

    Dodam że jest to na potrzeby realizacji protokołu Modbus ASCII. Widziałem prawie gotowe biblioteki ale nie wiele z nich wynika, a próbuję skonstruować odpowiedź slave'a do mastera.
    Pozdrawiam.
  • #2 10189666
    Jado_one
    Poziom 22  
    W którym miejscu masz problem z konwersją?
  • #3 10189950
    Krokus22
    Poziom 19  
    Chodzi o to rozbicie Hexa na dwie składowe, gdybym miał je w formacie inta (składową H i L w tablicy dwuelementowej), to przekonwertowałbym je przy pomocy Lookup table.
  • Pomocny post
    #4 10190165
    INTOUCH
    Poziom 30  
    Nie bardzo rozumiem co kombinujesz ale jeżeli programujesz w C to możesz skorzystać z.
    #include <string.h>
    #include <stdlib.h>
    Jak chcesz podzielić int na 2*char to możesz skorzystać z unii.
  • Pomocny post
    #5 10190238
    michalko12
    Specjalista - Mikrokontrolery
    O coś takiego chodzi?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #6 10190270
    Szumlus
    Poziom 17  
    Witam,
    Kolega za dużo kombinuje...bierzemy bajt do konwersji i rozdzielamy na dwie 4 bitowe wartości (używamy do tego celu maski zmienna = zmienna&maska), następnie konwertujesz dwa półbajty do ASCII i po problemie :)
    Sama konwersja też jest dość prosta, sprawdzasz czy pół bajt mniejszy od 10 jeśli tak to robisz logiczny or z 0x30h jeśli większy lub równy możesz użyć np. lookup table.

    Pozdrawiam,
    Marcin
  • Pomocny post
    #7 10190287
    michalko12
    Specjalista - Mikrokontrolery
    Szumlus napisał:
    Kolega za dużo kombinuje...bierzemy bajt do konwersji i rozdzielamy na dwie 4 bitowe wartości


    A według ciebie co ten kod powyżej dodatkowo robi?
  • Pomocny post
    #8 10190498
    Jado_one
    Poziom 22  
    Oj...za szybko, żeście gotowca walnęli ;-)
  • #9 10190688
    Krokus22
    Poziom 19  
    Spokojnie, ja też coś skleiłem eksperymentalnie w C++ oto kod.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #10 10191083
    Jado_one
    Poziom 22  
    Troche skomplikowanie to wygląda - ale ja nie znam C++ :-)
    Rozumiem, ze to czesc wiekszej całości?
    Działa?

    Ja osobiście podziały bajtów (lub liczb wielobajtowych) realizuję (podobnie jak koledzy wyżej) przez maskowanie odp. fragmentów bajtów (lub większych wielobajtowych zmiennych) za pomocą masek bitowych + odpowiednie przesunięcia bitowe.
  • #11 10191504
    Krokus22
    Poziom 19  
    Podana funkcja hex2ascii działa wyśmienicie, dziękuję!
REKLAMA