Escribir bytes en el archivo

88

Tengo una cadena hexadecimal (por ejemplo 0CFE9E69271557822FE715A8B3E564BE) y quiero escribirla en un archivo como bytes. Por ejemplo,

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¾

¿Cómo puedo lograr esto usando .NET y C #?

John Doe
fuente
1
Posiblemente un duplicado de stackoverflow.com/questions/311165/…
Steven Mastandrea
1
@Steven: Solo parcial. No es la parte más importante.
John Doe
1
Posible duplicado de ¿Se puede escribir una matriz Byte [] en un archivo en C #? (también tal vez solo un duplicado parcial).
Jeff B

Respuestas:

158

Si te entiendo correctamente, esto debería funcionar. Deberá agregarlo using System.IOen la parte superior de su archivo si aún no lo tiene.

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
fuente
74

La forma más sencilla sería convertir su cadena hexadecimal en una matriz de bytes y usar el File.WriteAllBytesmétodo.

Usando el StringToByteArray()método de esta pregunta , harías algo como esto:

string hexString = "0CFE9E69271557822FE715A8B3E564BE";

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

El StringToByteArraymétodo se incluye a continuación:

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();
}
Rosquilla
fuente
Gracias, esto funciona bien. ¿Cómo puedo agregar bytes al mismo archivo? (después de la primera 'cadena')
John Doe
1
@Robertico: Agrega un valor booleano de verdadero al tercer parámetro de WriteAllBytes. ¿Ya descubrió MSDN? Este es el primer enlace de Google al buscar WriteAllBytes append.
1
Recibí un error al agregar el valor booleano 'Sin sobrecarga para el método' WriteAllBytes 'toma' 3 'argumentos'. MSDN describe: "Sin embargo, si está agregando datos a un archivo mediante un bucle, un objeto BinaryWriter puede proporcionar un mejor rendimiento porque solo tiene que abrir y cerrar el archivo una vez". Estoy usando un bucle. Utilizo el ejemplo de @ 0A0D y cambié 'FileMode.Create' a 'FileMode.Append'.
John Doe
3

Prueba esto:

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
fuente
Gracias, esto también funciona bien. ¿Cómo puedo agregar bytes al mismo archivo? (después de la primera 'cadena')
John Doe
2

Convierte la cadena hexadecimal en una matriz de bytes.

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édito: Jared Par

Y luego use WriteAllBytes para escribir en el sistema de archivos.

Khepri
fuente
1
Si hace referencia a una respuesta de Stack Overflow existente como la respuesta a esta pregunta, entonces es una apuesta bastante segura que esta es una pregunta duplicada y debe marcarse como tal.
ChrisF
1
En este caso, solo respondió parte de su pregunta, por lo que sentí que no necesitaba ser marcado como un engañado. Solo llegaría a la mitad del camino con ese conocimiento.
Khepri
0

Este ejemplo lee 6 bytes en una matriz de bytes y los escribe en otra matriz de bytes. Realiza una operación XOR con los bytes para que el resultado escrito en el archivo sea el mismo que los valores iniciales originales. El archivo tiene siempre un tamaño de 6 bytes, ya que escribe en la posición 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();
        }
    }
}
vive el amor
fuente