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 #?
Respuestas:
Si te entiendo correctamente, esto debería funcionar. Deberá agregarlo
using System.IO
en 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; } }
fuente
La forma más sencilla sería convertir su cadena hexadecimal en una matriz de bytes y usar el
File.WriteAllBytes
método.Usando el
StringToByteArray()
método de esta pregunta , harías algo como esto:string hexString = "0CFE9E69271557822FE715A8B3E564BE"; File.WriteAllBytes("output.dat", StringToByteArray(hexString));
El
StringToByteArray
mé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(); }
fuente
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(); }
fuente
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.
fuente
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(); } } }
fuente