2011-06-18 153 views
60

我有一个十六进制字符串(例如0CFE9E69271557822FE715A8B3E564BE),我想将它作为字节写入文件。例如,将字节写入文件

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¾ 

我该如何使用.NET和C#来完成此操作?

+1

可能http://stackoverflow.com/questions/311165/how-do-you-convert-byte-array-to-hexadecimal-string-and-vice-versa-in-c –

+1

的副本@斯蒂芬:只有部分。不是最重要的部分。 –

+1

[可以将字节\ [\]数组写入C#中的文件的可能的重复?](http://stackoverflow.com/questions/381508/can-a-byte-array-be-written-to-a -file-in-c)(也可能只是部分重复)。 –

回答

113

如果我正确,这个你懂应该做的伎俩。如果您尚未拥有它,则需要在文件顶部添加using System.IO

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; 
    } 
} 
63

最简单的方法是将您的十六进制字符串转换为字节数组并使用File.WriteAllBytes方法。

this question使用StringToByteArray()方法,你会做这样的事情:

string hexString = "0CFE9E69271557822FE715A8B3E564BE"; 

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

StringToByteArray方法包含如下:

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

Thx,这工作正常。我怎样才能将字节附加到同一个文件? (在第一个'字符串'之后) –

+1

@Robertico:你为WriteAllBytes的第三个参数添加一个布尔值true。你有没有发现MSDN?这是搜索WriteAllBytes附件时的第一个Google链接。 – 2011-06-18 20:43:00

+1

我收到一个错误,添加了布尔值'方法'WriteAllBytes'没有重载'3'参数'。 MSDN介绍:'但是,如果您使用循环将数据添加到文件,BinaryWriter对象可以提供更好的性能,因为您只需打开和关闭一次文件。“我正在使用循环。我使用@ 0A0D中的示例并将“FileMode.Create”更改为“FileMode.Append”。 –

2

将十六进制字符串转换为字节数组。

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(); 
} 

信用:Jared Par

然后用WriteAllBytes写入文件系统。

+0

如果你引用一个现有的Stack Overflow答案作为这个问题的答案,那么这是一个相当安全的选择,这是一个重复的问题,应该标记为这样。 – ChrisF

+1

在这种情况下,它只回答了他的问题的一部分,所以我觉得它不需要被标记为愚蠢。他只会在这方面得到一半的知识。 – Khepri

2
 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

Thx,这也很好。我怎样才能将字节附加到同一个文件? (在第一个'字符串'之后) –