2016-02-18 2 views
2

J'ai un fichier csv qui stocke les valeurs longues dans ce format:Convertir 0x0000000000000001 de chaîne à longue

0x0000000000000001 
0x0000000000000002 
0x0000000000000020 
0x0000000000040000 

Je veux enregistrer les valeurs des variables longues. Je peux enregistrer les données directement tant par exemple:

long t = 0x0000000000040000; 

Cela ne jette pas une exception.

Cependant, je n'arrive pas à convertir ce format de chaîne (comme je l'ai lu du fichier csv) à long.

J'ai essayé

Convert.ToInt64("0x0000000000040000"); 

comme suggéré dans this question

J'ai aussi essayé

long.Parse("0x0000000000040000", NumberStyles.HexNumber); 

Mais cela jette aussi une exception

je peux analyser quand je me débarrasser de le 0x à l'avant. Mais le numéro est ensuite enregistré sans les zéros (par exemple 0x0000000000000001 devient 1), ce qui n'est pas ce que je veux.

Tl; dr:

Est-ce que quelqu'un sait comment analyser

string s = "0x0000000000000001"; 

à

long l = 0x0000000000000001; 

?

+1

double possible de [Comment analyser les valeurs hexagonales dans un uint?] (Http://stackoverflow.com/questions/98559/how-to-parse-hex-values-into-a-uint) – Grundy

+1

utilisez 's.Subtring (2)', donc vous supprimez les deux premiers caractères '0x' – Ian

+3

» Mais le numéro est alors sauvegardé sans les zéros (par ex. 0x0000000000000001 devient juste 1), ce qui n'est pas ce que je veux. "- Le nombre est le même. Si vous voulez le * formater différemment en l'écrivant quelque part (par exemple 'l.ToString (" x16 ")'), c'est un autre point, mais vous ne devriez pas vous soucier de la façon dont un nombre est représenté quand il n'y a pas de différence. tout. – Joey

Répondre

2

Quelque chose comme ceci:

String source = "0x0000000000040000"; 

    long result = Convert.ToInt64("0" + source.TrimStart('0', 'x'), 16); 

ou même

long result = Convert.ToInt64(source, 16); 

Pour reconvertir string:

String back = String.Format("0x{0:x16}", result); 
+1

' Convert.ToInt64 (source.TrimStart ('0', 'x'), 16) 'est problématique avec' "0x0000000000000000" '.Édité: Suppression de la mauvaise déclaration du commentaire, désolé. –

+0

@Jeppe Stig Nielsen: vous avez tout à fait raison: '0x0' est un * contre exemple *, j'ai édité la réponse:' "0" + source.TrimStart ('0', 'x') ' –

+0

@Dimitry Bonne réponse, mais la partie de rognage est complètement inutile, 'Convert.ToInt64' gère le préfixe hexadécimal' '0x' très bien. –

1

Une alternative est que vous pouvez simplement omettre les deux premiers caractères votre conversion en utilisant la méthode Substring:

string s = "0x0000000000040000"; 
long l = Convert.ToInt64(s.Substring(2), 16); 
+0

Exemple de compteur: 's =" 0x00000FFFF "' –

+0

@DmitryBychenko J'ai été surpris que vous soyez réellement ... correct! Mais je me demande pourquoi ... – Ian

+0

'Convert.ToInt64 (s.Substring (2), 16);', s'il vous plaît, note * 16 * –