2011-05-27 3 views
3

J'ai une fonction simple qui saisit le disque dur le numéro de série du lecteur C: \ et le met dans une chaîne:écriture du disque dur chaîne série dans un fichier binaire

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

Je puis tenter de convertir la chaîne ci-dessus en ASCII, puis l'écrire dans un fichier binaire, le problème que je rencontre est, lors de la conversion de cette chaîne et l'enregistrement du fichier en utilisant streamwriter, et l'ouverture du fichier dans un éditeur hexadécimal, je vois plus d'octets Je voulais à l'origine écrire ainsi par exemple "16342D1F4A61BC"

Va sortir comme: 08 16 34 2d 1f 4a 61 c2 bc

Il est d'ajouter le 08 et c2 là en quelque sorte ...

La version plus complète est la suivante:

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

Quelqu'un peut-il me aider à comprendre comment ils commencent à être ajoutées?

+0

Vous ne pouvez simplement écrire directement la sortie? – tofutim

+4

Quel est le but de la boucle while? Il y a un Encoding.ASCII.GetBytes (chaîne) pratique qui vous renverra les octets nécessaires de n'importe quelle chaîne. – Joe

+0

Je pense que vous dites que vous voulez voir la représentation hexadécimale de l'identifiant de disque dur lorsque vous affichez votre fichier de sortie en hexadécimal. – tofutim

Répondre

0

Essayez d'utiliser System.Text.Encoding.ASCII .GetBytes (hdStr) pour obtenir les octets qui représentent la chaîne en ASCII.

+0

@tofutim, je ne peux pas l'écrire directement J'ai besoin d'écrire la représentation ASCII de la chaîne hexadécimale dans un fichier binaire, si j'utilise System.Text.Encoding.ASCII comme suit: writeBinay.Write (System.Text.Encoding. ASCII.GetBytes (hdStr)); quand je regarde le fichier écrit dans un éditeur hexadécimal, il ressemble à ceci: 31 36 33 34 32 44 31 46 34 41 36 31 42 43 (16342D1F4A61BC) –

+0

Ah - vous voulez écrire l'hex de la chaîne plutôt que les octets ASCII . D'ACCORD. –

1

Essayez ceci:

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

Avec les fonctions d'aide suivantes:

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

Simon! C'est exactement ce que je voulais faire, merci beaucoup! –

0

Quelle est l'importance pour vous endian-ness dans le fichier?

Peut-être que vous pouvez utiliser quelque chose comme:

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