Je convertis quelque chose de VB en C #. Avoir un problème avec la syntaxe de cette instruction:
if ((searchResult.Properties["user"].Count > 0))
{
profile.User = System.Text.Encoding.UTF8.GetString(searchResult.Properties["user"][0]);
}
Je vois alors les erreurs suivantes:
Argument 1: impossible de convertir «objet» en «octet []»
La meilleure correspondance de méthode surchargée pour 'System.Text.Encoding.GetString (byte [])' contient des arguments non valides
J'ai essayé de corriger le code basé sur ce post, mais toujours pas de succès
string User = Encoding.UTF8.GetString("user", 0);
Aucune suggestion?
searchResult.Properties["user"][0]
? Essayez de le lancer enbyte[]
premier(byte[])
sur le résultat de la recherche?Properties["user"][0]
s'agit. Si vous êtes sûr qu'il s'agit d'un tableau d'octets, vous pouvez effectuer un cast comme ceciprofile.User = System.Text.Encoding.UTF8.GetString((byte[])searchResult.Properties["user"][0]);
Réponses:
Si vous avez déjà un tableau d'octets, vous devrez savoir quel type de codage a été utilisé pour en faire ce tableau d'octets.
Par exemple, si le tableau d'octets a été créé comme ceci:
Vous devrez le reconvertir en une chaîne comme celle-ci:
Si vous pouvez trouver dans le code dont vous avez hérité, l'encodage utilisé pour créer le tableau d'octets, alors vous devriez être défini.
la source
Tout d'abord, ajoutez l'
System.Text
espace de nomsEnsuite, utilisez ce code
J'espère y remédier!
la source
Vous pouvez également utiliser une méthode d'extension pour ajouter une méthode au
string
type ci-dessous:Et utilisez-le comme ci-dessous:
la source
ToASCIIByteArray
. Je déteste quand je découvre une bibliothèque que j'utilise utilise ASCII et je suppose qu'elle utilise UTF-8 ou quelque chose de plus moderne.la source
la source
Pourquoi Encoding.Default ne doit pas être utilisé ...
@ Randall's answer uses
Encoding.Default
, cependant Microsoft lève un avertissement contre cela :Pour vérifier quel est l'encodage par défaut, utilisez
Encoding.Default.WindowsCodePage
(1250 dans mon cas - et malheureusement, il n'y a pas de classe prédéfinie d'encodage CP1250, mais l'objet peut être récupéré commeEncoding.GetEncoding(1250)
).Encoding.ASCII
est 7 bits, donc ça ne marche pas non plus, dans mon cas:... et pourquoi le codage UTF-8 devrait être utilisé à la place ...
L'encodage par défaut est trompeur: .NET utilise UTF-8 partout comme le véritable défaut (les encodages 8 bits sont devenus obsolètes à la fin du 20ème siècle, vérifiez par ex.
Console.OutputEncoding.EncodingName
*), donc chaque constante que vous définissez dans le code est UTF-8 encodée par défaut - donc celui-ci doit être utilisé sauf si la source de données est dans un codage différent.* C'est UTF-8 dans mon cas qui est un mensonge direct:
chcp
partir de la console Windows (cmd) renvoie 852 - et cela ne doit pas être modifié, car les commandes système localisées (comme ping) ont cette page de code codée en durSuivant la recommandation de Microsoft:
Encoding.UTF8
recommandé par d'autres est une instance de l'encodage UTF-8 et peut également être utilisé directement ou... mais il n'est pas toujours utilisé
L'encodage des tableaux d'octets devrait "fonctionner" dans Unicode dans les pays occidentaux, mais dès que vous déplacez votre programme vers certaines régions moins prises en charge (comme ici en Europe de l'Est), c'est un vrai bordel: en République tchèque, Windows utilise par défaut Windows (en 2020!) MS non standard 852 (alias Latin-2) pour console, 1250 en tant qu'OEM Windows, UTF-8 (65001) en tant que .NET (et autres) nouveau par défaut et nous devons garder à l'esprit que certains pays occidentaux de l'UE 8 bits les données sont toujours en 1252, alors que l'ancienne norme occidentale 8 bits pour l'Europe de l'Est était ISO-8859-2 (alias Latin-2, mais PAS le même Latin-2 que 852). L'utilisation de l'ASCII signifie du texte plein de tofu et «?» ici. Donc, jusqu'à la moitié du 21e siècle, veuillez définir explicitement UTF-8 .
la source
En s'appuyant sur la réponse d'Ali , je recommanderais une méthode d'extension qui vous permet de transmettre éventuellement l'encodage que vous souhaitez utiliser:
Et utilisez-le comme ci-dessous:
la source
Encoding encoding = Encoding.Default
entraîne une erreur de temps de compilation:CS1736 Default parameter value for 'encoding' must be a compile-time constant
L'approche suivante ne fonctionnera que si les caractères sont de 1 octet. (Unicode par défaut ne fonctionnera pas car il est de 2 octets)
Rester simple
la source
char
etstring
sont UTF-16 par définition.string
et est donc UTF-16. UTF-16 n'est pas la valeur par défaut; il n'y a pas d'autre choix. Vous vous divisez ensuite enchar[]
unités de code UTF-16. Vous appelez ensuite Convert.ToByte (Char) , ce qui arrive juste pour convertir U + 0000 en U + 00FF en ISO-8859-1 , et gomme tout autre point de code.char
16 bits etConvert.ToByte()
jetez-en la moitié.utilisez ceci
la source
Un raffinement de l'édition de JustinStolle (utilisation par Eran Yogev de BlockCopy).
La solution proposée est en effet plus rapide que l'utilisation de l'encodage. Le problème est qu'il ne fonctionne pas pour le codage de tableaux d'octets de longueur inégale. Comme indiqué, il déclenche une exception hors limite. Augmenter la longueur de 1 laisse un octet de fin lors du décodage à partir d'une chaîne.
Pour moi, le besoin est venu quand j'ai voulu encoder de
DataTable
àJSON
. Je cherchais un moyen d'encoder des champs binaires en chaînes et de décoder de chaîne en retourbyte[]
.J'ai donc créé deux classes - une qui encapsule la solution ci-dessus (lors de l'encodage à partir de chaînes, c'est bien, car les longueurs sont toujours égales), et une autre qui gère l'
byte[]
encodage.J'ai résolu le problème de la longueur inégale en ajoutant un seul caractère qui me dit si la longueur d'origine du tableau binaire était impaire ('1') ou même ('0')
Comme suit:
la source
Cette question a été répondue suffisamment de fois, mais avec C # 7.2 et l'introduction du type Span, il existe un moyen plus rapide de le faire dans un code non sécurisé:
Gardez à l'esprit que les octets représentent une chaîne codée UTF-16 (appelée "Unicode" en C # land).
Une analyse comparative rapide montre que les méthodes ci-dessus sont environ 5 fois plus rapides que leurs implémentations Encoding.Unicode.GetBytes (...) / GetString (...) pour les chaînes de taille moyenne (30 à 50 caractères), et encore plus rapides pour les chaînes plus grandes. Ces méthodes semblent également plus rapides que l'utilisation de pointeurs avec Marshal.Copy (..) ou Buffer.MemoryCopy (...).
la source
Si le résultat de 'searchResult.Properties ["user"] [0]' est une chaîne:
Le point clé étant que la conversion d'une chaîne en octet [] peut être effectuée à l'aide de LINQ:
Et l'inverse:
la source
Quelqu'un voit-il une raison de ne pas le faire?
la source
Convert.ToByte(char)
ne fonctionne pas comme vous le pensez. Le caractère'2'
est converti en octet2
, pas l'octet qui représente le caractère'2'
. Utilisezmystring.Select(x => (byte)x).ToArray()
plutôt.C'est ce qui a fonctionné pour moi
la source
Vous pouvez utiliser l' API MemoryMarshal pour effectuer une conversion très rapide et efficace.
String
sera implicitement converti enReadOnlySpan<byte>
, commeMemoryMarshal.Cast
accepte soitSpan<byte>
ou enReadOnlySpan<byte>
tant que paramètre d'entrée.Le benchmark suivant montre la différence:
la source
Ce travail pour moi, après cela, je pouvais convertir mettre ma photo dans un champ bytea dans ma base de données.
la source