Avatar billede fbisen Nybegynder
12. oktober 2010 - 12:26 Der er 5 kommentarer og
1 løsning

Hex til char (QuotedPrintable decoding)

Hej Eksperter.

Nu har jeg længe prøvet at få løst dette simple lille problem.

Jeg har en string som er encoded i QuotedPrintable. Det vil sige at man kan have en string al'a  "=3D=96" hvor de to tal efter = tegnet er HEX, som skal konverteres til en char. Problemet er at det er alt efter hvilken encoding man bruger.

Problemet jeg har lige nu, er at min QP decoder ikke kan decode "=96" i windows-1254 encoding til "-" (Se http://en.wikipedia.org/wiki/Windows-1254 decimal værdi 150)

Min kode ser ud som følgende:
// decode holds =XX where XX is hex digits
// The number part of the string is the last two digits. Here we simply remove the equal sign
string numberString = decode.Substring(1);

// Now convert the number encoded in the string as a hex value to an decimal integer
int decimalNumber = Convert.ToInt16(numberString, 16);

// Convert the integer to a char, and we are done
char decodedChar = Convert.ToChar(decimalNumber);

Problemet er nu, at Convert.ToChar konverer til unicode - hvilket er forkert! Mit tal specificerer char værdien for en char i windows-1252, og jeg kan ikke finde en metode at gå fra int til char ved brug af en encoding.

Håber nogle kan hjælpe - det virker som et simpelt problem!

mvh
Kasper
Avatar billede lasserasch Juniormester
12. oktober 2010 - 13:07 #1
Spørgsmål.

Det er en typo når du skriver '1254' i starten af dit spørgsmål ik?

"=3D=96" duer heller ikke (måske også bare en typo). Det kan være "=96" som rigtigt nok bliver konverteret til 150 med din kode.

Hvad får du af output og hvad ville du gerne have haft af output?

Mvh.
Lasse
Avatar billede aaberg Nybegynder
12. oktober 2010 - 14:05 #2
Du konvertere eksempeltvis x96 til en char på følgende måde:

byte[] data = new byte[]{ Convert.ToByte("96", 16) };

string result = Encoding.GetEncoding(1254).GetString(data);
Avatar billede aaberg Nybegynder
12. oktober 2010 - 14:14 #3
Så hvis du skal konvertere en streng med et vilkårligt lighedstegn med en hexværdi efter, kan du bruge følgende kode:


string input = "=3D=96";
string[] inputArray = input.Split('=');
List<byte> inputBytes = new List<byte>();

foreach (string hexVal in inputArray)
{
    if (!string.IsNullOrEmpty(hexVal))
    {
        inputBytes.Add(Convert.ToByte(hexVal, 16));
    }
}

string outputString = Encoding.GetEncoding(1254).GetString(inputBytes.ToArray());

outputtet er en streng, som i bund og grund bare er et char-array. Hvis du skal bruge et bestemt char, kan du bare bruge det som et char array. eksempeltvis:

char a = outputString[0];
char b = outputString[1];
Avatar billede arne_v Ekspert
12. oktober 2010 - 15:11 #4
Avatar billede fbisen Nybegynder
12. oktober 2010 - 16:21 #5
Tak for svarene.

lasserasch:
Jo - du har helt ret. Jeg mente 1252! Undskyld.
Med hensyn til "=3D=96", så er det en hel valid encoding. Den decodes til "=-". Altså er "=3D" = "=" og "=96" = "-".

aaberg_cc:
Kanon. Tak for kommentaren. Det virker perfekt.
Smid lige et svar. Mange tak for hjælpen :)

Mit endelige resultat blev:
----
// decode holds =XX where XX is hex digits
// The number part of the string is the last two digits. Here we simply remove the equal sign
string numberString = decode.Substring(1);

// Now create a byte array where we store our one-byte converted hex number.
// Convert the number encoded in the string as a hex value to an byte
// This will also handle illegal encodings like =3d where the hex digits are not uppercase,
// which is a robustness requirement from RFC 2045We need a byte array to store our hex number in
byte[] bytes = new[] { Convert.ToByte(numberString, 16) };

// Now, using our encoding, get back the string that this byte array corrosponds to
// which is actually a char, but GetString does only take arrays, not a single byte
return encoding.GetString(bytes);
----

arne_v:
Nu er det godt nok ikke URL-decoding jeg er ved at lave. Den har dog nogle ligheder, men f.eks skal & ikke oversættes til & og _ skal oversættes til " " <-- space.
Avatar billede aaberg Nybegynder
12. oktober 2010 - 16:53 #6
Svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester