Question

À ce stade, la plupart des gens penseront : « Ah, je vais poster ceci : »

byte[] dataB= System.Text.Encoding.ASCII.GetBytes(data);

Cependant..le problème que j'ai est que j'ai besoin de la valeur exacte des octets sans encodage, juste la valeur pure de chaque octet.Par exemple, si la valeur de la chaîne est (0xFF32), je veux qu'elle la convertisse également {255,50}.La raison en est que j'ai un format de fichier que j'essaie de lire et qui stocke les entiers sous forme d'octets, les enregistre puis les lit à l'ouverture du programme.

Voici ce que j'ai jusqu'à présent :

...
dialog.InitialDirectory =
    Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop) +
    "/Test";

dialog.Title="Open File";

if (dialog.ShowDialog(this) == DialogResult.OK)
{
    StreamReader reader = new StreamReader(dialog.FileName);
    string data = reader.ReadToEnd();
    reader.Close();
    byte[] fileC = System.Text.Encoding.ASCII.GetBytes(data);
    File_Read(dialog.FileName,fileC);
}
...

Ainsi, lorsque j'essaie de lire le fichier, il convertit les couvents de fichiers, par exemple 0xFF, en 0x3F, car 0xFF est supérieur à 127 et 0x3F est un ?.

Désolé si je semble un peu confus :)

Merci Michel

Était-ce utile?

La solution

Le problème est votre approche pour commencer:

  

J'ai besoin la valeur exacte des octets sans encodage

...

  

Par exemple, si la valeur de la chaîne est (0xFF32)

C'est un peu comme regarder une peinture à l'huile et en disant: « Je veux que les octets pour cette image, sans codage. » Il n'a pas de sens. Les textes ne sont pas les mêmes que les données binaires. Une fois que vous comprenez cela, il est facile de se rendre à la racine du problème. Ce que vous voulez vraiment est le contenu d'un fichier comme un tableau d'octets. C'est facile, car les fichiers sont données binaires! Vous ne devriez pas en train de lire comme texte en premier lieu si elle est pas vraiment texte. Heureusement, .NET fait vraiment facilement:

byte[] fileC = File.ReadAllBytes(dialog.FileName);

Autres conseils

Cependant..le problème que j'ai est que j'ai besoin de la valeur exacte des octets sans encodage, juste la valeur pure de chaque octet.

Ensuite, utilisez ceci :

byte[] dataB = System.Text.Encoding.Unicode.GetBytes(data);

Il renvoie les octets tels que stockés en interne par les chaînes .NET.

Mais tout cela n’est que de la morue :Une chaîne est toujours lié à un encodage particulier et il n'y a aucun moyen de contourner ce problème.Ce qui précède échouera, par ex.si le fichier contient des séquences de code Unicode non valides (ce qui peut arriver) ou via la normalisation.Puisque visiblement ce n'est pas le cas vouloir un string, n'en lisez pas un.Lisez plutôt le fichier sous forme de données binaires.

// convertir une chaîne en un tableau d'octets

public static byte[] StrToByteArray(string str)
{
    System.Text.UTF8Encoding  encoding=new System.Text.UTF8Encoding();
    return encoding.GetBytes(str);
}

// convertir un tableau d'octets à une chaîne

public string ByteArrayToStr(byte [] dBytes)
{
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
return enc.GetString(dBytes);
}

Utilisez un BinaryReader .

Pourquoi convertir la chaîne du tout? Ne pourriez-vous lire le contenu du fichier directement en octets?

byte[] fileC = File.ReadAllBytes(dialog.FileName);

Si vous voulez octets, utilisez un flux!

Pourquoi diable êtes-vous jouer avec un TextReader?

EDIT:

Selon votre exemple, vous ouvrez un fichier, donc il suffit d'utiliser un FileStream.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top