[c#] Char > Decimal > String

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Squ1zZy
  • Registratie: April 2011
  • Niet online
Ik heb even een duw in de juiste richting nodig. Ik heb een text bestand met als inhoud "aa bb !!"

Wat ik ook doe, de output blijft in decimal:

9797
9898

Hieronder de code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        static void Main(string[] args)
        {
            byte[] bytes = System.IO.File.ReadAllBytes("C:\\Users\\UserName\\Downloads\\test.txt");

            string myString = "";

            for (int i = 0; i < bytes.Length; i++)
            {
                if (bytes[i] >= 34 && bytes[i] <= 126)
                {
                    myString = myString + bytes[i];
                }
                else
                {
                    if (myString.Length > 3)
                    {
                        Console.WriteLine("{0:x}", myString);
                        myString = "";
                    }
                }
            }
            Console.ReadLine();
        }


Ik dacht dat "{0:x}" de string in hex zou weergeven?

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 12:11
Die werkt alleen met int, chars, longs, bytes, etc. Niet met een String.
Je kan op regel 11 het al omzetten en dan op regel 17 alleen het resultaat tonen.

Acties:
  • 0 Henk 'm!

  • Squ1zZy
  • Registratie: April 2011
  • Niet online
Caelorum schreef op zaterdag 10 oktober 2015 @ 18:24:
Die werkt alleen met int, chars, longs, bytes, etc. Niet met een String.
Je kan op regel 11 het al omzetten en dan op regel 17 alleen het resultaat tonen.
Zo dus :)

code:
1
myString = myString + Convert.ToChar(bytes[i]);


Thanks ;)

[ Voor 39% gewijzigd door Squ1zZy op 10-10-2015 19:27 ]


Acties:
  • 0 Henk 'm!

  • Squ1zZy
  • Registratie: April 2011
  • Niet online
Ik heb alles werkend, maar het verdient niet de schoonheidsprijs:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
            for (int i = 0; i < bytes.Length; i++)
            {
                if (bytes[i] >= 32 && bytes[i] <= 126)
                {
                    myString = myString + Convert.ToChar(bytes[i]);
                }
                else
                {
                    if (myString.Length > Convert.ToInt32(args[0]))
                    {
                        Console.WriteLine(myString);
                    }
                    myString = "";
                }
                if (i == bytes.Length -1 && myString.Count() > 1)
                {
                    Console.WriteLine(myString);
                }
            }


Ook zitten er allemaal if statements in om de arguments te controleren:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            if (!(int.TryParse(args[0], out value)))
            {
                Console.WriteLine("For help use the parameter --help");
                System.Environment.Exit(1);
            }
            if (args.Length == 0 || args.Length > 2)
            {
                Console.WriteLine("For help use the parameter --help");
                System.Environment.Exit(1);
            }
            if (args.Length == 1 & args[0] != "--help")
            {
                Console.WriteLine("For help use the parameter --help");
                System.Environment.Exit(1);
            }


Ook dit moet anders kunnen? Vind de code zo slordig. Moet alles proberen dicht te timmeren..

[ Voor 169% gewijzigd door Squ1zZy op 11-10-2015 11:46 ]


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Nu online
Waarom ga je zelf bytes naar een string omzetten?
MSDN: File.ReadAllText Method (String) (System.IO)
Of, als je liever een array van regels hebt:
MSDN: File.ReadAllLines Method (String) (System.IO)

Edit: er zit iets meer logica achter dan ik op het eerste gezicht dacht blijkbaar

[ Voor 10% gewijzigd door sig69 op 11-10-2015 12:29 ]

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • Squ1zZy
  • Registratie: April 2011
  • Niet online
sig69 schreef op zondag 11 oktober 2015 @ 12:27:
Waarom ga je zelf bytes naar een string omzetten?
MSDN: File.ReadAllText Method (String) (System.IO)
Of, als je liever een array van regels hebt:
MSDN: File.ReadAllLines Method (String) (System.IO)

Edit: er zit iets meer logica achter dan ik op het eerste gezicht dacht blijkbaar
Omdat de input ook een executable kan zijn b.v.

Acties:
  • 0 Henk 'm!

  • Rotterdammertje
  • Registratie: Juni 2002
  • Laatst online: 28-03-2023
Je kan de code voor het opsplitsen van de bytes in leesbare groepen opschonen door gebruik te maken van een Iterator method. De iterator method breekt de bytes op in leesbare chunks. Je code wordt dan zoiets:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
   class Program
    {
        static bool IsReadable(byte b)
        {
            return (b >= 34) && (b <= 126);
        }

        static bool IsNotReadable(byte b)
        {
            return !IsReadable(b);
        }

        public static IEnumerable<IEnumerable<byte>> ReadableChunks(IEnumerable<byte> source)
        {
            while (source.Any())
            {
                source = source.SkipWhile(IsNotReadable);
                if (source.Any())
                {
                    yield return source.TakeWhile(IsReadable);
                    source = source.SkipWhile(IsReadable);
                }
            }
        }

        static void Main(string[] args)
        {
            byte[] bytes = File.ReadAllBytes(@"C:\Dev\psubst.zip");
            foreach(var chunk in ReadableChunks(bytes).Where(c => c.Count() > 3))
            {
                string result = String.Concat(chunk.Select(Convert.ToChar));
                Console.WriteLine(result);
            }
        }
    }


De ReadableChunks method breekt de lijst met bytes op in chunks van opeenvolgende leesbare bytes, en slaat alle niet-leesbare bytes over. In de foreach loop wordt deze lijst met chunks gefilterd zodat alleen de chunks met een lengte groter dan 3 overblijven. Hierna wordt iedere byte in de chunk omgezet naar een char, en de chars worden samengevoegd in een string. :)

main = putStr (q ++ show q); q = "main = putStr (q ++ show q); q = "


Acties:
  • 0 Henk 'm!

  • Squ1zZy
  • Registratie: April 2011
  • Niet online
Rotterdammertje schreef op maandag 12 oktober 2015 @ 12:14:
Je kan de code voor het opsplitsen van de bytes in leesbare groepen opschonen door gebruik te maken van een Iterator method. De iterator method breekt de bytes op in leesbare chunks. Je code wordt dan zoiets:

C#:
1
KNIP


De ReadableChunks method breekt de lijst met bytes op in chunks van opeenvolgende leesbare bytes, en slaat alle niet-leesbare bytes over. In de foreach loop wordt deze lijst met chunks gefilterd zodat alleen de chunks met een lengte groter dan 3 overblijven. Hierna wordt iedere byte in de chunk omgezet naar een char, en de chars worden samengevoegd in een string. :)
Dit is een stuk netter inderdaad. Thanks!

Edit: Nu wordt er per woord een output gegeven. Het werkt goed, maar als voorbeeld "dit is een test" wordt dan dit op een regel, is op een regel etc. Zou mooi zijn als dit als zin op 1 regel kan.

[ Voor 10% gewijzigd door Squ1zZy op 12-10-2015 12:42 ]


Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 08:02
Squ1zZy schreef op maandag 12 oktober 2015 @ 12:36:
[...]


Dit is een stuk netter inderdaad. Thanks!

Edit: Nu wordt er per woord een output gegeven. Het werkt goed, maar als voorbeeld "dit is een test" wordt dan dit op een regel, is op een regel etc. Zou mooi zijn als dit als zin op 1 regel kan.
Console.WriteLine doet automatisch een CRLF, je zou op zich kunnen zoeken naar een Console functie die alles op dezelfde lijn schrijft, maar da's simpel zelf te doen ;)

Acties:
  • 0 Henk 'm!

  • Rotterdammertje
  • Registratie: Juni 2002
  • Laatst online: 28-03-2023
Squ1zZy schreef op maandag 12 oktober 2015 @ 12:36:
[...]


Dit is een stuk netter inderdaad. Thanks!

Edit: Nu wordt er per woord een output gegeven. Het werkt goed, maar als voorbeeld "dit is een test" wordt dan dit op een regel, is op een regel etc. Zou mooi zijn als dit als zin op 1 regel kan.
De IsReadable method sluit nu spaties uit -- alles met ASCII code groter gelijk aan 34 en kleiner gelijk aan 126 wordt als readable beschouwd. Spaties hebben ASCII code 32. Het is een triviale aanpassing om IsReadable aan te passen zodat spaties ook als readable worden beschouwd. :)

main = putStr (q ++ show q); q = "main = putStr (q ++ show q); q = "


Acties:
  • 0 Henk 'm!

  • Squ1zZy
  • Registratie: April 2011
  • Niet online
Rotterdammertje schreef op maandag 12 oktober 2015 @ 13:41:
[...]


De IsReadable method sluit nu spaties uit -- alles met ASCII code groter gelijk aan 34 en kleiner gelijk aan 126 wordt als readable beschouwd. Spaties hebben ASCII code 32. Het is een triviale aanpassing om IsReadable aan te passen zodat spaties ook als readable worden beschouwd. :)
Niet gezien. Dit werkt perfect :)
Thanks again!

Acties:
  • 0 Henk 'm!

  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 16:23
Je weet dat strings zo'n beetje kan wat je wil? Weliswaar niet in hex, maar printable characters hoef je toch juist niet naar hex te converteren?

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans

Pagina: 1