web-dev-qa-db-fra.com

C # comment convertir une grosse chaîne HEX en binaire

J'ai une chaîne de 14 caractères. Ceci est une représentation hexadécimale de 7 octets. Je veux le convertir en binaire. J'ai essayé d'utiliser Convert.ToString(Convert.ToInt32(hexstring, 16), 2); Pour les petites chaînes, cela fonctionne, mais pour 14 caractères, cela ne fonctionnera pas car le résultat est trop grand. Comment puis-je gérer cela? Gardez à l'esprit que la sortie de la conversion doit être une chaîne binaire de 56 caractères (nous devons conserver les zéros à gauche). (par exemple, la conversion de (octet) 0x01 devrait donner "00000001" plutôt que "1")

15
jayt csharp

Vous pouvez simplement convertir chaque chiffre hexadécimal en quatre chiffres binaires:

string binarystring = String.Join(String.Empty,
  hexstring.Select(
    c => Convert.ToString(Convert.ToInt32(c.ToString(), 16), 2).PadLeft(4, '0')
  )
);

Vous avez besoin d'un using System.Linq; en haut du fichier pour que cela fonctionne.

25
Guffa
Convert.ToString(Convert.ToInt64(hexstring, 16), 2);

Peut être? Ou

Convert.ToString(Convert.ToInt64(hexstring, 16), 2).PadLeft(56, '0');
8
Ry-

Pourquoi ne pas simplement adopter une approche simple et définir votre propre cartographie?

private static readonly Dictionary<char, string> hexCharacterToBinary = new Dictionary<char, string> {
    { '0', "0000" },
    { '1', "0001" },
    { '2', "0010" },
    { '3', "0011" },
    { '4', "0100" },
    { '5', "0101" },
    { '6', "0110" },
    { '7', "0111" },
    { '8', "1000" },
    { '9', "1001" },
    { 'a', "1010" },
    { 'b', "1011" },
    { 'c', "1100" },
    { 'd', "1101" },
    { 'e', "1110" },
    { 'f', "1111" }
};

public string HexStringToBinary(string hex) {
    StringBuilder result = new StringBuilder();
    foreach (char c in hex) {
        // This will crash for non-hex characters. You might want to handle that differently.
        result.Append(hexCharacterToBinary[char.ToLower(c)]);
    }
    return result.ToString();
}

Notez que cela gardera les zéros en tête. Donc, "aa" serait converti en "10101010" tandis que "00000aa" serait converti en "0000000000000000000010101010".

6
configurator

Ma réponse en arrière-plan C++:

private Byte[] HexToBin(string pHexString)
{
    if (String.IsNullOrEmpty(pHexString))
        return new Byte[0];

    if (pHexString.Length % 2 != 0)
        throw new Exception("Hexstring must have an even length");

    Byte[] bin = new Byte[pHexString.Length / 2];
    int o = 0;
    int i = 0;
    for (; i < pHexString.Length; i += 2, o++)
    {
        switch (pHexString[i])
        {
            case '0': bin[o] = 0x00; break;
            case '1': bin[o] = 0x10; break;
            case '2': bin[o] = 0x20; break;
            case '3': bin[o] = 0x30; break;
            case '4': bin[o] = 0x40; break;
            case '5': bin[o] = 0x50; break;
            case '6': bin[o] = 0x60; break;
            case '7': bin[o] = 0x70; break;
            case '8': bin[o] = 0x80; break;
            case '9': bin[o] = 0x90; break;
            case 'A':
            case 'a': bin[o] = 0xa0; break;
            case 'B':
            case 'b': bin[o] = 0xb0; break;
            case 'C':
            case 'c': bin[o] = 0xc0; break;
            case 'D':
            case 'd': bin[o] = 0xd0; break;
            case 'E':
            case 'e': bin[o] = 0xe0; break;
            case 'F':
            case 'f': bin[o] = 0xf0; break;
            default: throw new Exception("Invalid character found during hex decode");
        }

        switch (pHexString[i+1])
        {
            case '0': bin[o] |= 0x00; break;
            case '1': bin[o] |= 0x01; break;
            case '2': bin[o] |= 0x02; break;
            case '3': bin[o] |= 0x03; break;
            case '4': bin[o] |= 0x04; break;
            case '5': bin[o] |= 0x05; break;
            case '6': bin[o] |= 0x06; break;
            case '7': bin[o] |= 0x07; break;
            case '8': bin[o] |= 0x08; break;
            case '9': bin[o] |= 0x09; break;
            case 'A':
            case 'a': bin[o] |= 0x0a; break;
            case 'B':
            case 'b': bin[o] |= 0x0b; break;
            case 'C':
            case 'c': bin[o] |= 0x0c; break;
            case 'D':
            case 'd': bin[o] |= 0x0d; break;
            case 'E':
            case 'e': bin[o] |= 0x0e; break;
            case 'F':
            case 'f': bin[o] |= 0x0f; break;
            default: throw new Exception("Invalid character found during hex decode");
        }
    }
    return bin;
}
3
Mirco Babin

Vous pouvez obtenir un tableau d'octets à partir d'une chaîne hexagonale en utilisant ce code

 public static byte[] StringToByteArray(String hex)
    {
        int NumberChars = hex.Length;
        byte[] bytes = new byte[NumberChars / 2];
        for (int i = 0; i < NumberChars; i += 2)
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
        return bytes;
    }
2
Dimuthu

Et si vous convertissez un personnage à la fois? Je ne peux pas tester cela, mais l'idée devrait marcher.

//Convert.ToString(Convert.ToInt32(hexstring, 16), 2)

StringBuilder sb = new StringBuilder();
foreach( char c in hexstring.ToCharArray() ){
  sb.Append( Convert.ToString(Convert.ToInt32(c.ToString(), 16), 2);
}
0
Babak Naffas

Tu peux le faire.

Je l’ai mise dans une classe appelée UtilMath C’est une bonne idée, car si vous l’utilisez dans un programme différent, vous pouvez utiliser la classe à nouveau . .

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Math.Util
{
    class UtilMath
    {

        public static string hex2binary(string hexvalue)
        {
            // Convert.ToUInt32 this is an unsigned int
            // so no negative numbers but it gives you one more bit
            // it much of a muchness 
            // Uint MAX is 4,294,967,295 and MIN is 0
            // this padds to 4 bits so 0x5 = "0101"
            return String.Join(String.Empty, hexvalue.Select(c => Convert.ToString(Convert.ToUInt32(c.ToString(), 16), 2).PadLeft(4, '0')));
        }
    }
}

maintenant, avant de l'utiliser, vous devez l'inclure,

using Math.Util

alors si vous avez besoin de l'utiliser, vous pouvez l'appeler en allant

UtilMath.hex2binary("FF");

Ou

String hexString = "FF";
UtilMath.hex2binary(hexString);

J'espère que cela t'aides.

0
Ja77aman