Écrire des octets dans un fichier

88

J'ai une chaîne hexadécimale (par exemple 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 accomplir cela en utilisant .NET et C #?

John Doe
la source
1
Peut-être un double de stackoverflow.com/questions/311165/…
Steven Mastandrea
1
@Steven: Seulement partiel. Pas la partie la plus importante.
John Doe
1
Double possible de Can a Byte [] Array être écrit dans un fichier en C #? (peut-être aussi seulement un duplicata partiel).
Jeff B

Réponses:

158

Si je vous comprends bien, cela devrait faire l'affaire. Vous devrez ajouter using System.IOen 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;
    }
}
Jeff B
la source
74

Le moyen le plus simple serait de convertir votre chaîne hexadécimale en un tableau d'octets et d'utiliser la File.WriteAllBytesméthode.

En utilisant la StringToByteArray()méthode de cette question , vous feriez quelque chose comme ceci:

string hexString = "0CFE9E69271557822FE715A8B3E564BE";

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

La StringToByteArrayméthode 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();
}
Donut
la source
Thx, cela fonctionne très bien. Comment puis-je ajouter des octets au même fichier? (après la première `` chaîne '')
John Doe
1
@Robertico: Vous ajoutez une valeur booléenne true au troisième paramètre de WriteAllBytes. Avez-vous déjà découvert MSDN? Ceci est le premier lien google lors de la recherche d'ajout WriteAllBytes.
1
J'ai reçu une erreur en ajoutant la valeur booléenne «Aucune surcharge pour la méthode« WriteAllBytes »prend« 3 »arguments». MSDN décrit: «Cependant, si vous ajoutez des données à un fichier à l'aide d'une boucle, un objet BinaryWriter peut fournir 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 j'ai changé «FileMode.Create» en «FileMode.Append».
John Doe
3

Essaye ç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();
}
xling
la source
Thx, cela fonctionne également très bien. Comment puis-je ajouter des octets au même fichier? (après la première `` chaîne '')
John Doe
2

Vous convertissez la chaîne hexadécimale 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édits: Jared Par

Et puis utilisez WriteAllBytes pour écrire dans le système de fichiers.

Khepri
la source
1
Si vous faites référence à une réponse Stack Overflow existante comme réponse à cette question, alors il y a fort à parier qu'il s'agit d'une question en double et qu'elle devrait être signalée comme telle.
ChrisF
1
Dans ce cas, il ne répondait qu'à une partie de sa question, donc je sentais qu'il n'avait pas besoin d'être marqué comme dupe. Il n'arriverait qu'à mi-chemin avec cette connaissance.
Khepri
0

Cet exemple lit 6 octets dans un tableau d'octets et l'écrit dans un autre tableau d'octets. Il effectue une opération XOR avec les octets afin que le résultat écrit dans le fichier soit le même que les valeurs de départ d'origine. 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();
        }
    }
}
l'amour en direct
la source