2011-05-27 50 views
3

我有一个简单的功能,抓住从C硬盘序列号:\驱动器,并把它转换成字符串:写作硬盘序列串为二进制文件

​​

然后我试图转换将上面的字符串转换成ASCII码,然后将其写入二进制文件,我遇到的问题是,在转换此字符串并使用streamwriter保存文件并在十六进制编辑器中打开该文件时,我看到更多的字节我原本想这样写例如“16342D1F4A61BC”

将出现为:08 16 34 2d 1f 4a 61 c2 bc

它添加在那里不知何故08和C2 ......

更完整版如下:

string constructor2 = "16342D1F4A61BC"; 
string StrValue = ""; 

while (constructor2.Length > 0) 
{ 
    StrValue += System.Convert.ToChar(System.Convert.ToUInt32(constructor2.Substring(0, 2), 16)).ToString(); 
    // Remove from the hex object the converted value 
    constructor2 = constructor2.Substring(2, constructor2.Length - 2); 
} 

FileStream writeStream; 
try 
{ 
    writeStream = new FileStream(Path.GetDirectoryName(Application.ExecutablePath) + "\\license.mgr", FileMode.Create); 
    BinaryWriter writeBinay = new BinaryWriter(writeStream); 
    writeBinay.Write(StrValue); 
    writeBinay.Close(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.ToString()); 
} 

谁能帮助我了解这些在获取添加?

+0

你不能直接写输出? – tofutim 2011-05-27 17:34:17

+4

while循环的目的是什么?有一个方便的Encoding.ASCII.GetBytes(字符串),它会从任何字符串返回必要的字节。 – Joe 2011-05-27 17:34:22

+0

我想你是说当你以十六进制查看你的输出文件时,你想看到硬盘ID的十六进制表示。 – tofutim 2011-05-27 17:48:56

回答

0

尝试使用System.Text.Encoding.ASCII。GetBytes(hdStr)以ASCII格式获取表示字符串的字节。

+0

@tofutim,我不能直接写它如果我使用System.Text.Encoding.ASCII如下所示,我需要将十六进制字符串的ascii表示形式写入二进制文件:writeBinay.Write(System.Text.Encoding。 ASCII.GetBytes(hdStr));当我在十六进制编辑器中查看写入文件时,它看起来像这样:31 36 33 34 32 44 31 46 34 41 36 31 42 43(16342D1F4A61BC) – 2011-05-27 17:40:39

+0

啊 - 你想写出字符串的十六进制而不是ASCII字节。好。 – 2011-05-27 18:27:57

1

试试这个:

string constructor2 = "16342D1F4A61BC"; 
File.WriteAllBytes("test.bin", ToBytesFromHexa(constructor2)); 

用下面的辅助函数:

public static byte[] ToBytesFromHexa(string text) 
{ 
    if (text == null) 
     throw new ArgumentNullException("text"); 

     List<byte> bytes = new List<byte>(); 
    bool low = false; 
    byte prev = 0; 

    for (int i = 0; i < text.Length ; i++) 
    { 
     byte b = GetHexaByte(text[i]); 
     if (b == 0xFF) 
      continue; 

     if (low) 
     { 
      bytes.Add((byte)(prev * 16 + b)); 
     } 
     else 
     { 
      prev = b; 
     } 
     low = !low; 
    } 
    return bytes.ToArray(); 
} 

public static byte GetHexaByte(char c) 
{ 
    if ((c >= '0') && (c <= '9')) 
     return (byte)(c - '0'); 

    if ((c >= 'A') && (c <= 'F')) 
     return (byte)(c - 'A' + 10); 

    if ((c >= 'a') && (c <= 'f')) 
     return (byte)(c - 'a' + 10); 

    return 0xFF; 
} 
+0

西蒙!这正是我想要它做的,非常感谢你! – 2011-05-27 17:51:05

0

如何重要的是字节序到您的文件吗?

或许你可以使用类似:

byte[] b = BitConverter.GetBytes(Convert.ToUInt32(hdStr, 16));