2009-06-29 12 views
0

J'ai une routine de décryptage dans VB6. Je veux maintenant le même décryptage en C#. Les chaînes qui ont besoin de décryptage sont en Unicode, donc j'utilise Encoding.Unicode.GetString pour lire l'entrée en C#. L'entrée est maintenant exactement la même que dans VB6.Problème Unicode Net, héritage vb6

Les premiers caractères de la boucle sont décryptés ok! Ensuite, je rencontre une différence ... Le programme analyse le caractère '~' avec un index différent de celui de VB6.

Lors du débogage, je vois ce qui suit dans VB et .Net:
VB6 ~ = Code 152
C# ~ = Code 732

Inutile de dire que l'échec du déchiffrement. Je dois obtenir 152 pour le personnage mentionné ci-dessus.

Quel est le problème ici?

Cordialement,

Michel

Répondre

1

Votre VB6 n'a pas été en train de lire Unicode (je suppose à codepage Windows 1252), ce qui est pourquoi il est revenu avec un code de caractère différent.

+0

Merci pour la réponse, vous avez raison. En fait j'ai oublié de lire le decryptionseed avec la page de codes 1252 en C#. –

0

Que voulez-vous dire par "caractère 152" exactement? Comment avez-vous eu ce numéro? Notez qu'être "en Unicode" peut signifier beaucoup de choses différentes. Êtes-vous sûr qu'il est encodé en UTF-16 dans les données binaires? Si vous pouviez poster plus d'informations sur les données sources, ce serait très utile.

En outre, le chiffrement et le décryptage devraient presque toujours être fait en utilisant des octets, pas des caractères. Bien que je comprenne que vous avez besoin de reproduire un comportement hérité, vous devriez essayer de migrer loin de traiter les chaînes comme des données binaires opaques au fil du temps.

+0

Vous avez raison, mais je ne peux pas convaincre mon patron de créer un système sain pour le moment. (J'ai 152 de débogage dans VB6) –

0

Je l'ai déjà fait. Le problème est dans votre encodage. Où .NET est unicode, VB6 est Unifail. Du côté .NET, vous devez utiliser Encoding.ASCII pour convertir vos chaînes en tableaux d'octets et vice versa.

Encoding.ASCII.GetString(decrypted); 
//and 
Encoding.ASCII.GetBytes(cleartext); 

Ainsi, lorsque vous cryptez d'envoyer à l'application VB, vous devez utiliser ASCII.GetBytes puis chiffrer que tableau d'octets, et quand vous obtenez un tableau d'octets du côté VB vous devez décrypter les et à utiliser ASCII.GetString pour décoder les octets en une chaîne utilisable.

+0

Will, c'est en effet une partie de ma solution. Cependant, j'ai utilisé Unicode au lieu de ASCII. Mon chiffrement et le texte crypté ne sont pas en base 64 ou même en ASCII 128. –