93 votes

Ecriture d'octets dans le fichier

Je dispose d'une chaîne hexadécimale (par ex. 0CFE9E69271557822FE715A8B3E564BE ) et je veux l'écrire dans un fichier sous forme d'octets. Par exemple,

Offset      0  1  2  3  4  5  6  7   8  9 10 11 12 13 14 15
00000000   0C FE 9E 69 27 15 57 82  2F E7 15 A8 B3 E5 64 BE   .þži'.W‚/ç.¨³åd¾

Comment puis-je réaliser cela en utilisant .NET et C# ?

1 votes

Peut-être un doublon de stackoverflow.com/questions/311165/

1 votes

@Steven : Seulement partiel. Pas la partie la plus importante.

1 votes

Duplicata possible de Peut-on écrire un tableau de Byte[] dans un fichier en C# ? (qui n'est peut-être aussi qu'un doublon partiel).

172voto

Si je vous comprends bien, cela devrait faire l'affaire. Vous devez ajouter using System.IO en haut de votre fichier si vous ne l'avez pas déjà.

public bool ByteArrayToFile(string fileName, byte[] byteArray)
{
    try
    {
        using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
        {
            fs.Write(byteArray, 0, byteArray.Length);
            return true;
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception caught in process: {0}", ex);
        return false;
    }
}

78voto

Donut Points 32892

La méthode la plus simple consiste à convertir votre chaîne hexadécimale en un tableau d'octets et à utiliser la fonction File.WriteAllBytes méthode.

Utilisation de la StringToByteArray() méthode de cette question vous feriez quelque chose comme ça :

string hexString = "0CFE9E69271557822FE715A8B3E564BE";

File.WriteAllBytes("output.dat", StringToByteArray(hexString));

Le site StringToByteArray est incluse ci-dessous :

public static byte[] StringToByteArray(string hex) {
    return Enumerable.Range(0, hex.Length)
                     .Where(x => x % 2 == 0)
                     .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                     .ToArray();
}

0 votes

Merci, cela fonctionne bien. Comment puis-je ajouter des octets dans le même fichier ? (après la première 'chaîne')

1 votes

@Robertico : Vous ajoutez une valeur booléenne de true au troisième paramètre de WriteAllBytes. Avez-vous déjà découvert MSDN ? C'est le premier lien google quand on cherche WriteAllBytes append.

1 votes

J'ai reçu une erreur en ajoutant la valeur booléenne "No overload for method 'WriteAllBytes' takes '3' arguments". MSDN décrit : Cependant, si vous ajoutez des données à un fichier à l'aide d'une boucle, un objet BinaryWriter peut offrir de meilleures performances car vous ne devez ouvrir et fermer le fichier qu'une seule fois. J'utilise une boucle. J'utilise l'exemple de @0A0D et je change 'FileMode.Create' en 'FileMode.Append'.

3voto

xling Points 167

Essayez ça :

private byte[] Hex2Bin(string hex) 
{
 if ((hex == null) || (hex.Length < 1)) {
  return new byte[0];
 }
 int num = hex.Length / 2;
 byte[] buffer = new byte[num];
 num *= 2;
 for (int i = 0; i < num; i++) {
  int num3 = int.Parse(hex.Substring(i, 2), NumberStyles.HexNumber);
  buffer[i / 2] = (byte) num3;
  i++;
 }
 return buffer;
}

private string Bin2Hex(byte[] binary) 
{
 StringBuilder builder = new StringBuilder();
 foreach(byte num in binary) {
  if (num > 15) {
   builder.AppendFormat("{0:X}", num);
  } else {
   builder.AppendFormat("0{0:X}", num); /////// 大于 15 就多加个 0
  }
 }
 return builder.ToString();
}

0 votes

Merci, cela fonctionne également très bien. Comment puis-je ajouter des octets dans le même fichier ? (après la première 'chaîne')

2voto

Khepri Points 5790

Vous convertissez la chaîne hexagonale en un tableau d'octets.

public static byte[] StringToByteArray(string hex) {
return Enumerable.Range(0, hex.Length)
                 .Where(x => x % 2 == 0)
                 .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                 .ToArray();
}

Crédit : Jared Par

Et ensuite utiliser WriteAllBytes pour écrire sur le système de fichiers.

1 votes

Si vous faites référence à une réponse existante de Stack Overflow pour répondre à cette question, il y a fort à parier qu'il s'agit d'une question dupliquée et qu'elle doit être signalée comme telle.

1 votes

Dans ce cas, elle ne répondait qu'à une partie de sa question, et je n'ai donc pas jugé nécessaire de la marquer comme un doublon. Il n'aurait fait que la moitié du chemin avec cette connaissance.

0voto

40-Love Points 1333

Cet exemple lit 6 octets dans un tableau d'octets et les écrit dans un autre tableau d'octets. Il effectue une opération XOR avec les octets de sorte que le résultat écrit dans le fichier soit identique aux valeurs de départ originales. Le fichier a toujours une taille de 6 octets, car il écrit à la position 0.

using System;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
        byte[] b1 = { 1, 2, 4, 8, 16, 32 };
        byte[] b2 = new byte[6];
        byte[] b3 = new byte[6];
        byte[] b4 = new byte[6];

        FileStream f1;
        f1 = new FileStream("test.txt", FileMode.Create, FileAccess.Write);

        // write the byte array into a new file
        f1.Write(b1, 0, 6);
        f1.Close();

        // read the byte array
        f1 = new FileStream("test.txt", FileMode.Open, FileAccess.Read);

        f1.Read(b2, 0, 6);
        f1.Close();

        // make changes to the byte array
        for (int i = 1; i < b2.Length; i++)
        {
            b2[i] = (byte)(b2[i] ^ (byte)10); //xor 10
        }

        f1 = new FileStream("test.txt", FileMode.Open, FileAccess.Write);
        // write the new byte array into the file
        f1.Write(b2, 0, 6);
        f1.Close();

        f1 = new FileStream("test.txt", FileMode.Open, FileAccess.Read);

        // read the byte array
        f1.Read(b3, 0, 6);
        f1.Close();

        // make changes to the byte array
        for (int i = 1; i < b3.Length; i++)
        {
            b4[i] = (byte)(b3[i] ^ (byte)10); //xor 10
        }

        f1 = new FileStream("test.txt", FileMode.Open, FileAccess.Write);

        // b4 will have the same values as b1
        f1.Write(b4, 0, 6);
        f1.Close();
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X