hexadecimalt tal till sträng

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

hexadecimalt tal till sträng

Inlägg av dangraf »

Hallå!
jag vill skriva en egen funktion som tar en t.ex char eller int och så att man får ut talet som en sträng.


ex inparameter 0xAA
resultat: "170"

jag har för mig att jag en gång gjorde en sådan funktion i VHDL i skolan men glömt hur själva algorithmen fungerar. Någon som kommer ihåg eller kan hitta en länk till hur man gör? Har letat ett tag nu men inte hittat.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Då du får värdet och inte "0xAA" är det ju bara att skriva ut det i decimal form. Om du vill göra det i VHDL kan jag nog inte hjälpa tyvärr.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

jag kom på att jag vill vara lite mer tydlig.
det går ju att räkna ut i med % och / men det jag hade tänkt mig är någon form av algorithm som kör med logiska beräkningar som << + - och maskningar..

ibland behöver man precisera sig när det finns så många svar att välja mellan :D
Pjoms
EF Sponsor
Inlägg: 644
Blev medlem: 24 maj 2004, 12:18:40
Ort: Ö-vik

Inlägg av Pjoms »

Om du googlar på "LHDL hex to ASCII converter" eller nå't i den stilen, så får i alla fall jag en del uppslag. Nu vet jag inget varken om VHDL eller dina "krav" i detalj så jag kan inte avgöra om det är avbändbara träffar för just *dig*... :)
Pjoms
EF Sponsor
Inlägg: 644
Blev medlem: 24 maj 2004, 12:18:40
Ort: Ö-vik

Inlägg av Pjoms »

>"... är det ju bara att skriva ut det i decimal form."

Han ville ju ha det som en sträng och har satt exemplet inom citat, så då tolkar jag att det blir ASCII
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Man kan göra det med subtraktion:
Räkna hur många gånger man kan dra av 10
Resten är ettor, lägg till 0x30 (='0')
Kopiera antalet gg till inkommande värde
Upprepa det hela men steg en decimalplats upp varje gång.
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

En algoritm som jag tycker är intressant ser ut så här, den går att utöka till hur stora tal som helst.


Flytta alla bitarna åt vänster i dessa byte:
Bcd0, Bcd1, Bcd2, Bin1, Bin0

Addera $3 till Bcd2 och spara värdet om bit 3=1.
Addera $30 till Bcd2 och spara värdet om bit 7=1.

Addera $3 till Bcd1 och spara värdet om bit 3=1.
Addera $30 till Bcd1 och spara värdet om bit 7=1.

Addera $3 till Bcd0 och spara värdet om bit 3=1.
Addera $30 till Bcd0 och spara värdet om bit 7=1.

Upprepa allt detta 15 gånger(totalt 15 gånger alltså) och avsluta med att flytta bitarna åt vänster en sista gång.


Om talet är 12345 (Bin0=$39 Bin1=$30) så blir resultatet Bcd0=$01 Bcd1=$23 Bcd2=$45
Senast redigerad av Chribbe76 27 augusti 2007, 22:23:52, redigerad totalt 1 gång.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47013
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Inlägg av TomasL »

Kika på strprint funktionerna i för C, där kan du hitta ideer. De används för att "konvertera" bin/hex till strängar, bla till dec strängar.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

>>chribbe76 Det var en sån algorithm jag var ute efter! Men jag förstår inte riktigt hur den fungerar trots din förklaring.
Hur menar du med att flytta alla bitarna åt vänster i dessa byte??
jag förstår inte riktigt placeringen av bytsen, låt säga att jag har ett 16 bitars tal jag vill konvertera, måste jag placera strängen först och därefter 16 bitars talet?.
bit 3 och bit 7, börjar du räkna från bit0?

tänkte köra ett litet exempel.
talet 0b1000 (talet 8);

bit 3 == 1;
b01000 + 0b11 = 0b1011
bit 7 == 0;
gör inget

bit 3 == 1;
0b1011+0b11 = 0b1110
bit 7 == 0;
gör inget

bit 3 == 1;
0b1110+0b11 = 0b10001
bit 7 ==0
gör inget

bit 3 == 0
gör inget.
bit 7 == 0
gör inget.

Det känns som det är massor jag missat
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Man ska börja med att nollställa Bcd0, Bcd1, Bcd2.
När man flyttar bitarna ett steg ska man flytta genom hela kedjan Bcd0, Bcd1, Bcd2, Bin1, Bin0.
Exempel: [Bin0 Bit7] flyttas till [Bin1 Bit0] och [Bin1 Bit7] flyttas till [Bcd2 Bit0].

för ett 16-bitars tal ska allt (inklusive att flytta bitarna) upprepas 15 gånger.
Det kanske går att upprepa 16 gånger så att man slipper flytta bitarna ytterligare en gång efter loopen, men jag är inte säker på det.

Det blir nog ganska jobbigt att testa genom att räkna manuellt, prova att skriva ett program som gör det istället.

Jag är nog inte så bra på att förklara så det är helt naturligt om du inte förstår.
Fråga på bara om du undrar något.
jbulow
Inlägg: 114
Blev medlem: 22 juni 2006, 21:35:26
Ort: Malmö

Inlägg av jbulow »

Vet inte om jag förstår frågan, men chansar.

Är det något i stil med följande du är ute efter: http://www.dattalo.com/technical/software/pic/bcd.txt

Att sen konvertera från BCD till sträng är ju en smal sak.

En bra printf-implementation att sno från det man behöver finns här: http://www.and.org/texts/simple_printf.c
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Tack jbulow!

Din första länk har jag letat efter.
backen
Inlägg: 60
Blev medlem: 22 juli 2005, 19:47:46
Kontakt:

Inlägg av backen »

Följande VHDL kod använder jag i en testbänk. (Integer to String)

Kod: Markera allt

  function ToString(val : integer) return string is
    variable last  : integer;
    variable digit : integer;
    variable tmp   : integer := abs(val);
    variable pos   : integer := 1;
    variable buf   : string(80 downto 1);

  begin
    loop
      digit    := abs(tmp mod 10);  -- MOD of integer'left returns neg number!
      tmp      := tmp / 10;
      buf(pos) := character'val(character'pos('0') + digit);
      pos      := pos + 1;
      exit when tmp = 0;
    end loop;
    if val < 0 then
      buf(pos) := '-';
      pos      := pos + 1;
    end if;
    pos := pos - 1;
    return buf(pos downto 1);
  end ToString;  -- function
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Satt med ett liknande problem på jobbet idag men kom fram till att sprintf() var nog så optimerad redan.Ett par länkar till på samma ämne:

ADD3-algoritmen (dela upp en u8 till ental, tiotal, hundratal) Går aldeles säkert att utöka till u16:
http://www.tfe.umu.se/courses/dator/Dat ... BinBCD.htm

GCC C/C++ implementationer av itoa()
http://www.jb.man.ac.uk/~slowe/cpp/itoa.html
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

vad många svar jag fått, tackar! jag har haft fullt upp, så jag har tyvärr inte hunnit testa hemma, men nu har jag lite mer konkret information att gå på. får testa lite under helgen hade jag tänkt.
Skriv svar