C# Encoding

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een probleem waar ik maar niet uitkom.

De volgende 2 routines ben ik mee bezig geweest:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        public static string MakeInt(int Value)
        {
            byte[] bytes = new byte[4];
            bytes[0] = (byte)(Value>> 24);
            bytes[1] = (byte)(Value>> 16);
            bytes[2] = (byte)(Value>> 8);
            bytes[3] = (byte)(Value);

            return System.Text.Encoding.UTF8.GetString(bytes, 0, 4);
        }

        public static int GetInt(string Value)
        {
                byte[] bytes = System.Text.Encoding.UTF8.GetBytes(Value);
                int value = (bytes[0] << 24) + ((bytes[1] & 0xFF) << 16) + ((bytes[2] & 0xFF) << 8) + (bytes[3] & 0xFF);
                return value;
        }


Het gene wat ik hiermee wil bereiken is een Int32 te converteren naar een string van 4 tekens.
Dit lijkt helemaal goed te gaan:

C#:
1
        string test = MakeInt(System.Int32.MaxValue);

Hier komt een string van 4 tekens uit: 127 255 255 255

echter als ik dan deze string weer wil omdraaien:
C#:
1
int result = GetInt(test);

Krijg ik bij de volgende regel een byte array terug bestaande uit 10 values:
C#:
1
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(Value);


Enig idee hoe ik dit kan terug converteren?

Als ik trouwens UniEncode gebruik komt er bij het maken van de string een string uit met een lengte van 2. Wat ik niet helemaal begrijp omdat 2 bytes toch 16 bits zijn :? en een Int32 is toch 32bits? :?

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 20:53

Haan

dotnetter

Probeer System.BitConverter.GetBytes(Int32) en System.BitConverter.ToInt32() eens :)

[ Voor 90% gewijzigd door Haan op 08-03-2010 21:40 . Reden: url's toegevoegd en foutje in url gefixt ]

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

gebruik je debugger, zet een breakpoint top regel 16. klopt je waarde daar wel? zo niet, dan moet je wellicht je bytes eerst converteren naar int's voordat je shift (ik weet niet of C# dat vanzelf voor je doet, maar zo niet dan gaat het resultaat van al je shifts 0 zijn gezien je alle bits wegshift uit de range (van 8bits)

-niks-


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 16-09 15:42

Sebazzz

3dp

4 tekens is niet vier bytes. Als ik mij niet vergis kan UTF-8 twee bytes voor een teken gebruiken (let op: kan). Daarmee kom je op acht tekens. De twee extra bytes zouden door een UTF-8 BOM te verklaren kunnen zijn. Ik raad je aan om gewoon naar good ol' ASCII te encoderen en decoderen, Waarvoor gebruik je geen int.Parse en int.ToString of een bitconverter?

edit: Van de wiki
00000000-01111111 	00-7F 	0-127 	US-ASCII (single byte)
10000000-10111111 	80-BF 	128-191 Second, third, or fourth byte of a 
                                        multi-byte sequence
Lijkt er inderdaad op dat twee bytes worden gebruikt per karakter.

[ Voor 33% gewijzigd door Sebazzz op 08-03-2010 21:42 ]

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Was ik ook al tegengekomen... maar hiermee heb ik hetzelfde probleem aan gezien de methode System.BitConverter.GetBytes() een byte array returned, ik moet die hebben als een string met een lengte van 4 bytes.

Als ik deze vervolgens convert krijg ik een string met een lengte van 4 bytes:
C#:
1
2
byte[] bytes = System.BitConverter.GetBytes(System.Int32.MaxValue);
string result = System.Text.Encoding.UTF8.GetString(bytes);

Dit klopt exact, maar het reversen vanaf een string werkt niet

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Sebazzz schreef op maandag 08 maart 2010 @ 21:37:
Waarvoor gebruik je geen int.Parse en int.ToString of een bitconverter?
De rede daarvoor is dat de volgorde eigenlijk anders zou moeten worden: 3e 1e 4e 2e byte :?

Dit moet vervolgens dmv van een string doorgegeven worden naar een ander pakket of eventueel opgehaald worden. Hier kan ik dus niet aan veranderen.

Ook moet de string altijd 4 bytes groot zijn

[ Voor 9% gewijzigd door Verwijderd op 08-03-2010 21:51 ]


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 20:53

Haan

dotnetter

Ik snap volgens mij het probleem dan niet. Op het moment dat je een array van 4 bytes hebt, kan je die toch op alle manieren die je maar wil in een string zetten?
Verwijderd schreef op maandag 08 maart 2010 @ 21:50:
De reden daarvoor is dat de volgorde eigenlijk anders zou moeten worden: 3e 1e 4e 2e byte :?
Dan doe je toch iets als
C#:
1
2
byte[] bytes = System.BitConverter.GetBytes(System.Int32.MaxValue);
string output = string.Format("{0}{1}{2}{3}", bytes[2], bytes[0], bytes[3], bytes[1]);

Dat geeft bij mij gewoon 255255127255 als output.

/offtopic:
Die System.BitConverter.GetBytes(Int32) methode gebruikt wel een gave manier om aan de bytes te komen. Als ik het goed begrijp, pakt die gewoon de pointer naar de value parameter, en vanaf daar de eerste vier bytes?
C#:
1
2
3
4
5
6
7
8
9
public static unsafe byte[] GetBytes(int value)
{
    byte[] buffer = new byte[4];
    fixed (byte* numRef = buffer)
    {
        *((int*) numRef) = value;
    }
    return buffer;
}

[ Voor 85% gewijzigd door Haan op 08-03-2010 22:00 ]

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Haan schreef op maandag 08 maart 2010 @ 21:51:
Ik snap volgens mij het probleem dan niet. Op het moment dat je een array van 4 bytes hebt, kan je die toch op alle manieren die je maar wil in een string zetten?
Klopt, dit lukt me dus niet:

C#:
1
2
3
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(Value); // Value = string

string Value = System.Text.Encoding.ASCII.GetString(bytes, 0, 4); //byte = byte array


Geven dus andere uitkomst

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Haan schreef op maandag 08 maart 2010 @ 21:51:
Ik snap volgens mij het probleem dan niet. Op het moment dat je een array van 4 bytes hebt, kan je die toch op alle manieren die je maar wil in een string zetten?


[...]

Dan doe je toch iets als
C#:
1
2
byte[] bytes = System.BitConverter.GetBytes(System.Int32.MaxValue);
string output = string.Format("{0}{1}{2}{3}", bytes[2], bytes[0], bytes[3], bytes[1]);

Dat geeft bij mij gewoon 255255127255 als output.
Thnx, dat ik daar niet eerder aan gedacht had...

Oplossing:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        public static int GetInt(string Value)
        {
            byte[] bytes = new byte[4];
            bytes[0] = (byte)Value[1];
            bytes[1] = (byte)Value[3];
            bytes[2] = (byte)Value[0];
            bytes[3] = (byte)Value[2];
            return System.BitConverter.ToInt32(bytes, 0);
        }
        public static string MakeInt(int value)
        {
            byte[] bytes = System.BitConverter.GetBytes(value);
            return string.Format("{0}{1}{2}{3}", (char)bytes[2], (char)bytes[0], (char)bytes[3], (char)bytes[1]);
        }
Pagina: 1