Gå til innhold

Java program som regner om HEX til RGB


Anbefalte innlegg

Hei! Har en oppgave hvor jeg må lage et java program som kan brukes til omregning av fargekode oppgitt på heksadesimal form til RGB-form. Har søkt mye på nettet og finner mye hjelp hvis det var RGB til HEX det hadde vært snakk om, men ingenting om HEX til RGB.

 

Etter litt søking på nettet har jeg ihvertfall funnet en side som kunne hjelpe, og prøvd meg frem men får ikke dette til å virke:/ noen som kan hjelpe?

 

public class fargekode {
   public int[] getRGB(String rgb){
   int[] ret = new int[3];
   for(int i=0; i<3; i++){
    ret[i] = hexToInt(rgb.charAt(i*2), rgb.charAt(i*2+1));
   }
   return ret;
   }
   public int hexToInt(char a, char b){
   int x = a < 65 ? a-48 : a-55;
   int y = b < 65 ? b-48 : b-55;
   return x*16+y;
   }}

Lenke til kommentar
Videoannonse
Annonse

Altså, du har en kode av typen #rrggbb hvor rr, gg og bb er heksadesimale verdier. Dette skal du gjøre om til tre verdier mellom 0 og 255?

 

Det første du vil gjøre er å splitte tekststengen som inneholder verdiene. Så gjør du om hver av de tre verdiene til heltall.

 

Hvorfor finner du opp hjulet på nytt? Integer.parseInt("ff", 16) = 255, hvis jeg ikke tar helt feil.

Lenke til kommentar

Hei! Har en oppgave hvor jeg må lage et java program som kan brukes til omregning av fargekode oppgitt på heksadesimal form til RGB-form. Har søkt mye på nettet og finner mye hjelp hvis det var RGB til HEX det hadde vært snakk om, men ingenting om HEX til RGB.

 

Etter litt søking på nettet har jeg ihvertfall funnet en side som kunne hjelpe, og prøvd meg frem men får ikke dette til å virke:/ noen som kan hjelpe?

 

Koden din funker fint, den. Her er en versjon som hvertfall funker

public class Fargekode {
   public static void main(String[] arg) {
    Fargekode fk = new Fargekode();
    Integer[] arr = fk.getRGB("FFFFFF");
    for(int i = 0; i < arr.length; i++) {
	    System.out.println(arr[i]);
    }

    arr = fk.getRGB("FFf");
    for(int i = 0; i < arr.length; i++) {
	    System.out.println(arr[i]);
    }
   }  
   public Integer[] getRGB(String rgb) {
    Integer[] ret = new Integer[3];
    rgb = rgb.toUpperCase();
    if(rgb.length() == 6) {
	    for(int i = 0; i < 3; i++) {
		    ret[i] = hexToInt(rgb.charAt(i*2), rgb.charAt(i*2 +1));
	    }
    } else if(rgb.length() == 3) {
	    for(int i = 0; i < 3; i++) {
		    ret[i] = hexToInt(rgb.charAt(i), rgb.charAt(i));
	    }
    }
    return ret;
   }  
   private int hexToInt(char a, char b) {
    int x = a < 65 ? a - 48 : a - 55;
    int y = b < 65 ? b - 48 : b - 55;
    return x*16 + y;
   }  
}

 

Du må bare huske på at hexToInt ikke takler små bokstaver. Derfor har jeg lagt på rgb = rgb.toUpperCase(); Vet du egentlig hva som foregår i koden? At du forstår koden du har skrevet er det viktigste. Man må gjerne tenke litt og ikke regne med at svaret finnes på internett. Det viktigste i denne oppgaven er kjennskap til tegnsett (ASCII eller UTF-8 siden de er like for de første 128 tegnene) og kjennskap til HEX-tall (16-tallsystemet [0-F])

Lenke til kommentar

Skal vel være så ærlig og si at jeg skjønner pent lite av koden ja, men må nødt til og få til et eller annet så gir det et forsøk. Men hvordan fikk du den koden til å fungere tro? Hvis jeg kjører programmet får jeg bare opp 255,255,255,255,255,255 uansett hva jeg gjør. Det jeg hadde sett for meg var at man fikk opp et dialogvindu hvor det sto: "Tast inn fargekode i HEX form" deretter trykke "Konverter til RGB form" så få svaret oppgitt i RGB form såklart. Men med denne koden fikk jeg jo RGB formen i 6 forskjellige verdier, skulle vært 3, og det hadde heller ikke noe betydning om jeg byttet ut "FFFFFF" i koden, ble fortsatt samme svaret på RGB form. Noe sånn som dette: http://www.rgbtohex.net/hextorgb/

 

 

Noen som kan hjelpe meg? Hater å spørre om hjelp når jeg ikke kan noe selv i det hele tatt og alt egentlig bare er klipp og lim, men er rimelig desp etter å få godkjent oppgava så jeg kan begynne å lese til eksamen...

Endret av Roger.Holland
Lenke til kommentar

Koden funket fint det, bare å fylle inn riktig verdi.

 

Brukte koden ovenfor, og la inn en boks hvor brukeren kan skrive inn HEX-koden, og det skrives ut i terminalen.

Ikke særlig avansert GUI, så du får lage et bedre om du føler det trengs.

 

Koden:

 

 

import javax.swing.JOptionPane;
public class Fargekode {
public static void main(String[] arg) {
 Fargekode fk = new Fargekode();
 String input = JOptionPane.showInputDialog("Enter value in HEX: ");
 Integer[] arr = fk.getRGB(input);

 for (int i = 0; i < arr.length; i++) {
  System.out.println(arr[i]);
 }
}
public Integer[] getRGB(String rgb) {
 Integer[] ret = new Integer[3];
 rgb = rgb.toUpperCase();
 if (rgb.length() == 6) {
  for (int i = 0; i < 3; i++) {
ret[i] = hexToInt(rgb.charAt(i * 2), rgb.charAt(i * 2 + 1));
  }
 } else if (rgb.length() == 3) {
  for (int i = 0; i < 3; i++) {
ret[i] = hexToInt(rgb.charAt(i), rgb.charAt(i));
  }
 }
 return ret;
}
private int hexToInt(char a, char b) {
 int x = a < 65 ? a - 48 : a - 55;
 int y = b < 65 ? b - 48 : b - 55;
 return x * 16 + y;
}
}

 

 

Endret av Fred7555
Lenke til kommentar

...

 

Hvor mye Java kan du? Hvis du ikke forstår koden er det bare å spørre hva den gjør. Den delen som er mest kryptisk er uten tvil

private int hexToInt(char a, char b) {
 int x = a < 65 ? a - 48 : a - 55;
 int y = b < 65 ? b - 48 : b - 55;
 return x * 16 + y;
}

og jeg tviler på at du vet hva den gjør. Jeg visste hvertfall ikke det når jeg begynte å leke med Java.

Den kan "dekrypteres" ganske enkelt.

w = q ? a : b er en ganske enkel if-else-kondition. Der w blir satt til a hvis q er sann, ellers blir w satt til b. Det kan også skrives som

 

private int hexToInt(char a, char b) {
 int x, y;
 if(a < 65) {
   x = a - 48;
 } else {
   x = a - 55;
 }

 if(b < 65) {
   y = b - 48;
 } else {
   y = b - 55;
 }

 return x * 16 + y;
}

noe jeg anbefaler at du gjør. Det gjør det litt enklere for den som skal rette oppgava, hvis den personen ikke kan shorthand if-else.

Ellers vil jeg anbefale deg å gå gjennom hele koden linje for linje og sette deg inn i akkurat hva den gjør. Programmering er som matte, mye trening og forståelse. Det er vanskelig å lese seg til grunnleggende ting rett før eksamen

Lenke til kommentar

Hvor mye Java kan du? Hvis du ikke forstår koden er det bare å spørre hva den gjør. Den delen som er mest kryptisk er uten tvil

private int hexToInt(char a, char b) {
 int x = a < 65 ? a - 48 : a - 55;
 int y = b < 65 ? b - 48 : b - 55;
 return x * 16 + y;
}

og jeg tviler på at du vet hva den gjør. Jeg visste hvertfall ikke det når jeg begynte å leke med Java.

Den kan "dekrypteres" ganske enkelt.

w = q ? a : b er en ganske enkel if-else-kondition. Der w blir satt til a hvis q er sann, ellers blir w satt til b. Det kan også skrives som

 

Den kan også skrives som

private int hexToInt(char a, char b) {
 return (Integer.parseInt(new StringBuilder(a).append(b).toString(), 16);
}

Litt mye kortere og litt mindre gjenoppfinning av hjulet.

Lenke til kommentar

Ja, det er sant at det kan skrives som du skriver det. Men nå er inntrykket mitt at TS ikke er særlig stødig i Java og burde lære å gjøre det selv. Både for å lære 16-tallsystemet og vite hvordan han kan gjøre noe liknende i andre programmeringsspråk, f.eks. C, som ikke har funksjoner for å gjøre sånne konverteringer.

Lenke til kommentar

Ja, det er sant at det kan skrives som du skriver det. Men nå er inntrykket mitt at TS ikke er særlig stødig i Java og burde lære å gjøre det selv. Både for å lære 16-tallsystemet og vite hvordan han kan gjøre noe liknende i andre programmeringsspråk, f.eks. C, som ikke har funksjoner for å gjøre sånne konverteringer.

Du skal få lov til å være uenig. Det står så i signaturen. Hvis du leser thedailywtf.com så vil du se at folk finner opp hjulet på nytt også i produksjonskode, så jeg mener at det er viktigere å kjenne til hvilke funksjoner som er tilgjengelige enn å lage egne funksjoner som øker kompleksiteten og lett kan introdusere logiske feil som er mer vanskelig å avluse.

 

Når det gjelder den funksjonen, vil den fungere like godt i med en UTF16 tegnkoding? Er ASCII-verdiene den samme for A-F her? Hvis den ikke er det så har du plutselig en veldig snedig bug å avluse fordi man da kan få en situasjon hvor det virker på den ene maskinen (dev/test), men ikke den andre (prod) hvis en datafil er gjort til en mock-up i dev/test og produksjon får noe helt annet.

 

Når det gjelder C spesielt og til en viss grad også C++, så er det veldig få som lærere dette fortsatt. Da jeg gikk på skole i '99 så var det et valgfag for spesielt interesserte. Når vi skulle prototype noen eksperiment så var Python førstevalget. IDLE var akkurat kommet og kombinasjonen av debugger og skriptspråk gjorde at man kunne få konsepter på plass raskt. I dag så er også C og stort sett C++ satt til side for nettopp Java og C#. Felles for disse er at det finnes mengder av bibliotek hvor funksjoner er tilgjengelig. Det å programmere disse handler mer om å finne og bruke bibliotek. Selvsagt så finnes det mange ting som ikke gjøres i bibliotek også, men hovedregelen er at man ikke bør gjøre ting vanskeligere enn nødvendig.

 

Det over er min mening og bør ikke tolkes som absolutte fakta

Lenke til kommentar

Faktisk så er block0 i Unicode lik Latin1, så det vil ikke være et problem, men poenget var at det kan snike seg uvented ting inn når slike triks plutselig får data som de ikke var beregnet for så kan det oppstå kluss.

I dette tilfellet er feilen at koden ikke feiler dersom teksten ikke er [0-9a-fA-F] men vil gi et svar som er helt på jordet.

  • Liker 1
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...