c# hex octet 0x09 (ascii -> onglet) à “\t” de la chaîne
J'ai besoin de convertir un tableau d'octets d'un fichier texte, c'est la chaîne de caractère de la représentation.
Par exemple, si j'ai un fichier texte qui comporte:
bonjour (onglet) il y a (saut de ligne) ami
Je voudrais convertir un tableau:
my_array = {'h', 'e' ,'l','l','o', '\t', 't', 'h','e','r','e', '\r','\n', 'f', 'r' ,'i','e','n', 'd'};
J'ai de la difficulté à convertir les caractères de contrôle de leurs échappé à cordes, c'est à dire:
- 0x09 = '\t';
- 0x0D = '\r';
- 0x0A = '\n';
J'ai essayé ceci, mais les onglets et les nouvelles lignes ne sont pas représentés ici:
byte[] text_bytes = File.ReadAllBytes("ok.txt");
char[] y = Encoding.ASCII.GetChars(text_bytes);
Je sais que je peux juste faire une boucle par chaque octet et avoir une condition de chercher 0x09
et si je la trouve, puis remplacer par "\t"
, mais je me demandais si il y a quelque chose de construit dans.
- C'est juste vide.
- À leur échappé à cordes? L'échappé de la chaîne pour le char '\t' ressemble à "\\t"
- Si vous la remplacez par "\t" seulement, vous avez remplacé rien.
- Vous êtes essentiellement en essayant de remplacer
0x09
avec 2 caractères "\" ET "t". Juste essayer d'aider u pense.
Vous devez vous connecter pour publier un commentaire.
Il y a plusieurs façons de le faire. Le plus simple serait de charger tout le fichier en mémoire:
Ensuite utiliser
string.Replace
pour remplacer les articles qui vous intéressent:Ensuite, vous pouvez créer votre tableau de caractères. Si vous êtes sûr qu'il est tout de texte ASCII, vous pouvez utiliser
Encoding.ASCII
:Ou, si vous voulez un tableau de caractères:
Qui va probablement être assez rapide pour vos besoins. Vous pourriez être en mesure de débit en une passe unique par le biais de la chaîne, la lecture caractère par caractère et de la copie vers un
StringBuilder
:Si vous voulez échapper tous les caractères de contrôle, alors vous pouvez utiliser les Regex.S'échapper.
Vous ne pouvez pas convertir un
char
tableau dans la manière que vous avez posté, car une fuite de caractère de contrôle seraient considérés comme deux caractères (\
ett
). Mais si vous n'avez pas l'esprit de chaque personnage étant séparé, vous pouvez simplement faireRegex.Escape
va également tourner "." en "\.", etc. Il échappera à toutes les regex caractères.\a\e\f\v
). Me semble qu'il vaut la peine de compiler si cette expression va être appelé souvent."[\a\e\f\n\r\t\v]"
, sans l'alternance des personnages. Je ne sais pas ce que ces alternance de caractères au sein d'un groupe de caractères. Semble que ce serait provoquer le caractère "|" pour être échappé.Dans le "y" du tableau, les "caractères échappés" auront leurs valeurs réelles (0x09, 0x0D, etc.) avec un caractère non imprimable comme le "texte".
Lorsque vous écrivez \t, \n, \r, etc. vous auriez pu écrire (char)0x09, (char)0x0D et c'est ce que les données sont écrites comme. En d'autres termes le "\t" personnage n'existe pas!
Si vous roulez votre propre, ou d'utiliser une bibliothèque existante, quelqu'un va avoir de carte 0x09 à l' "\t" séquence d'échappement et de l'injecter dans votre chaîne.
Si vous ne me dérange pas qu'il soit quelque peu plus lent qu'un roulé à la main de la solution, alors vous pouvez utiliser un
CodeDomProvider
(qui serait probablement assez vite).J'ai trouvé un exemple de code ici: http://code.google.com/p/nbehave-cf/source/browse/trunk/CustomTool/StringExtensions.cs?spec=svn5&r=5
Que vous pouvez l'utiliser par la lecture de la chaîne à l'aide de
Encoding.Ascii.ReadString()
, et ensuite utiliser.ToLiteral()
pour la convertir en une chaîne de caractères, puis.ToCharArray()
pour obtenir le résultat final.Cela donne le résultat correct avec, par exemple:
Si vous inspectez
result
vous allez voir qu'il a les caractères corrects.Cependant, je voudrais utiliser une boucle et d'une instruction switch pour convertir les caractères. C'est facile à écrire et à comprendre, et il serait beaucoup plus efficace.
I know I can just loop through each byte and have a condition to look for 0x09 and if I find it, then replace with "\t", but I'm wondering if there is something built in
, qui est la question que je vais répondre.