Запись строки с жесткого диска в двоичный файл - PullRequest
3 голосов
/ 27 мая 2011

У меня есть простая функция, которая берет серийный номер жесткого диска с диска C: \ и помещает его в строку:

ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"C:\"");
disk.Get();
string hdStr = Convert.ToString(disk["VolumeSerialNumber"]);

Затем я пытаюсь преобразовать приведенную выше строку в ASCII, а затем записать ее в двоичный файл, проблема, с которой я сталкиваюсь, заключается в том, что при преобразовании этой строки и сохранении файла с помощью streamwriter и открытии файла в В шестнадцатеричном редакторе я вижу больше байтов, которые я изначально хотел написать, например, "16342D1F4A61BC"

Получится как: 08 16 34 2d 1f 4a 61 c2 bc

Это как-то добавляет 08 и с2 ...

Более полная версия выглядит следующим образом:

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

Может кто-нибудь помочь мне понять, как они добавляются?

Ответы [ 3 ]

1 голос
/ 27 мая 2011

Попробуйте это:

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 голосов
/ 27 мая 2011

Насколько важен для вас порядок файлов в файле?

Возможно, вы можете использовать что-то вроде:

byte[] b = BitConverter.GetBytes(Convert.ToUInt32(hdStr, 16));
0 голосов
/ 27 мая 2011

Попробуйте использовать System.Text.Encoding.ASCII .GetBytes (hdStr), чтобы получить байты, представляющие строку в ASCII.

...