2008-10-20 12 views
0

Comment convertir un parapraphe en notation hexadécimale, puis revenir dans sa forme de chaîne d'origine?Conversion d'un paragraphe en notations hexadécimales, puis retour à la chaîne

(C#)

Une note de côté: serait mettre la chaîne en format hexadécimal rétrécir le plus w/o entrer dans le hardcore rétrécissement algo de?

+0

Parlez-vous de base64? J'allais poster une réponse, mais en relisant je ne suis pas sûr que vous sachiez ce que vous voulez dire. Pouvez-vous donner un exemple d'une chaîne que vous voulez convertir, puis un exemple de la même chaîne convertie? –

+0

D'accord avec Adam - Je ne suis pas sûr que l'affiche sache ce qu'il veut. Si vous voulez transformer "Bonjour" en "48656C6C6F", c'est assez facile, mais je ne pense pas que ce soit tout à fait ça. – Coderer

+0

Je devine l'attribution des devoirs. –

Répondre

1
public string ConvertToHex(string asciiString) 
{ 
    string hex = ""; 
    foreach (char c in asciiString) 
    { 
     int tmp = c; 
     hex += String.Format("{0:x2}", (uint)System.Convert.ToUInt32(tmp.ToString())); 
    } 
    return hex; 
} 
+0

utilisez stringbuilder! –

+0

ouais je devrais avoir .. bien que ce soit le premier morceau de C# que j'ai écrit dans un moment. Im un python hacker :) –

6

Qu'entendez-vous par "notation hexadécimale"? Cela fait généralement référence à l'encodage de données binaires, pas de texte. Vous devez coder le texte d'une manière ou d'une autre (par exemple en utilisant UTF-8), puis encoder les données binaires en tant que texte en convertissant chaque octet en une paire de caractères.

using System; 
using System.Text; 

public class Hex 
{ 
    static void Main() 
    { 
     string original = "The quick brown fox jumps over the lazy dog."; 

     byte[] binary = Encoding.UTF8.GetBytes(original); 
     string hex = BytesToHex(binary); 
     Console.WriteLine("Hex: {0}", hex); 
     byte[] backToBinary = HexToBytes(hex); 

     string restored = Encoding.UTF8.GetString(backToBinary); 
     Console.WriteLine("Restored: {0}", restored); 
    } 

    private static readonly char[] HexChars = "ABCDEF".ToCharArray(); 

    public static string BytesToHex(byte[] data) 
    { 
     StringBuilder builder = new StringBuilder(data.Length*2); 
     foreach(byte b in data) 
     { 
      builder.Append(HexChars[b >> 4]); 
      builder.Append(HexChars[b & 0xf]); 
     } 
     return builder.ToString(); 
    } 

    public static byte[] HexToBytes(string text) 
    { 
     if ((text.Length & 1) != 0) 
     { 
      throw new ArgumentException("Invalid hex: odd length"); 
     } 
     byte[] ret = new byte[text.Length/2]; 
     for (int i=0; i < text.Length; i += 2) 
     { 
      ret[i/2] = (byte)(ParseNybble(text[i]) << 4 | ParseNybble(text[i+1])); 
     } 
     return ret; 
    } 

    private static int ParseNybble(char c) 
    { 
     if (c >= '0' && c <= '9') 
     { 
      return c-'0'; 
     } 
     if (c >= 'A' && c <= 'F') 
     { 
      return c-'A'+10; 
     } 
     if (c >= 'a' && c <= 'f') 
     { 
      return c-'A'+10; 
     } 
     throw new ArgumentOutOfRangeException("Invalid hex digit: " + c); 
    } 
} 

Non, cela ne le réduirait pas du tout. Au contraire, vous finiriez avec beaucoup plus de texte! Cependant, vous pouvez compresser le formulaire binaire. En termes de représentation de données binaires arbitraires en tant que texte, Base64 est plus efficace que hexadécimal. Utilisez Convert.ToBase64String et Convert.FromBase64String pour les conversions.

+0

incroyable! Que fait b >> 4? déplacement? –

+0

Oui, il déplace le byte vers la droite, donc vous finissez avec un seul nybble (0-15). –

+0

visuellement parlant, à quoi cela ressemble-t-il? la valeur de l'octet n'est-elle pas en train de changer maintenant? –

0

Bien que je ne puisse pas m'empêcher de m'étendre sur l'implémentation C#, je recommanderais fortement LZW comme un algorithme de compression de données simple à implémenter à utiliser.

0

Peut-être que la réponse peut être plus rapidement atteinte si nous demandons: qu'est-ce que vous essayez vraiment de faire? Convertir une chaîne ordinaire en une chaîne de représentation hexadécimale semble être la mauvaise approche de n'importe quoi, sauf si vous faites un didacticiel hexadécimal/d'encodage pour le web.

0
static byte[] HexToBinary(string s) { 
    byte[] b = new byte[s.Length/2]; 
    for (int i = 0; i < b.Length; i++) 
    b[i] = Convert.ToByte(s.Substring(i * 2, 2), 16); 
    return b; 
} 
static string BinaryToHex(byte[] b) { 
    StringBuilder sb = new StringBuilder(b.Length * 2); 
    for (int i = 0; i < b.Length; i++) 
    sb.Append(Convert.ToString(256 + b[i], 16).Substring(1, 2)); 
    return sb.ToString(); 
}