2013-08-19 4 views
1

J'utilise BitConverter.ToString(bytes) pour convertir par chaîne en chaîne hexadécimale que je convertis en entier ou en flottant.C# bitconverter.ToString convertir en chaîne hexadécimale

Mais le flux d'entrée sont constitués de 0 à montrer que la valeur d'octet est égal à 0. Supposons donc j'ai un nombre entier qui est représenté par 2 octets de données à partir de la position x et la première consistent en EE tandis deuxième octet est 00. Maintenant quand j'utilise BitConverter.ToString(bytes, x, 2).Replace ("-","") je reçois la sortie comme EE00 dont la valeur entière est 60928 mais dans ce cas la sortie devrait être 238 qui convertit seulement le premier octet EE en nombre entier.

Mais dans un autre cas, les 2 octets pourraient être EE01 dont la valeur entière sera 60929 ce qui est correct dans ce cas.

Une suggestion comment puis-je résoudre mon problème?

Puisque certaines personnes disent que cette question est confuse je vais reformuler mon problème J'ai une longue chaîne hexadécimale en entrée. Dans la chaîne hexadécimale

1) Les 12 premiers octets représentent une chaîne. 2) les 11 octets suivants représentent également une autre chaîne. 3) Le premier octet représente l'entier. 4) Les 3 octets suivants représentent l'entier. 5) Les 4 octets suivants représentent l'entier. 6) Les 4 octets suivants représentent le flottant. 7) Les 7 octets suivants représentent la chaîne. 8) Les 5 octets suivants représentent l'entier. Donc pour le 4ème cas si les octets sont ee 00 00 alors je devrais négliger les 0 et convertir ee en nombre entier. Mais si ee 00 ee alors je devrais convertir ee00ee en entier. Aussi chaque fois que je vais suivre le même modèle que mentionné ci-dessus.

+0

Vous êtes un peu confus - dites-vous que "00" marque la fin du flux? Si oui, vous ne devriez même pas le passer au convertisseur ... –

+1

Jetez un oeil à ce http://en.wikipedia.org/wiki/Endianness – LunicLynx

+0

'int résultat = int.Parse (string.Join (" ", input.Select ((item, inx) => nouveau {item, inx}). GroupBy (x => x.inx/2) .Sélectionnez (g => new string (g.ToArray())). (s => s! = "00" && s.Length! = 2)); ' –

Répondre

0

Cette méthode convertit une chaîne hexadécimale en un tableau d'octets.

public static byte[] ConvertHexString(string hex) 
{ 
    Contract.Requried(!string.IsNullOrEmpty(hex)); 

    // get length 
    var len = hex.Length; 

    if (len % 2 == 1) 
    { 
    throw new ArgumentException("hexValue: " + hex); 
    } 

    var lenHalf = len/2; 

    // create a byte array 
    var bs = new byte[lenHalf]; 

    try 
    { 
    // convert the hex string to bytes 
    for (var i = 0; i != lenHalf; i++) 
    { 
     bs[i] = (byte)int.Parse(hex.Substring(i * 2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture); 
    } 
    } 
    catch (Exception ex) 
    { 
    throw new ParseException(ex.Message, ex); 
    } 

    // return the byte array 
    return bs; 
} 

De l'autre côté:

public static string ConvertByteToHexString(byte num) 
{ 
    var text = BitConverter.ToString(new[] { num }); 

    if (text.Length == 1) 
    { 
    text = "0" + text; 
    } 

    return text; 
} 
+1

Il y en a déjà un intégré. 'var byteArray = SoapHexBinary.Parse (hexString) .Value' – I4V

+1

mais ici vous avez besoin d'une référence à l'aide de System.Runtime.Remoting.Metadata.W3cXsd2001; dont certains ne veulent pas ce lien. –

0

Mon problème a été résolu. Je faisais une erreur d'Endianness. Je recevais les données comme EE 00 et j'aurais dû le prendre comme 00 EE avant de convertir en nombre entier. Merci à tous ceux qui m'ont donné une solution pour mon problème et désolé d'avoir manqué ce fait important de la question.

Questions connexes