2011-12-15 1 views
3

image est la chaîne d'un fichier image.Différence de base 64 entre C# et Java

J'ai code comme suit en C#:

Convert.ToBase64String(image);

et le code comme suit en Java: org.apache.commons.codec.binary.Base64.encodeBase64(image.getBytes())

Le résultat est différent.

Quelqu'un dit son parce

  • Java octet: -128 à 127

  • C# octet: 0 à 255

Mais comment puis-je résoudre ce problème? Comment puis-je implémenter le Convert.ToBase64String() de C# en Java? J'ai besoin du même résultat qu'en C# en utilisant Java.

+1

Vous dites 'image' est une chaîne. Mais 'Convert.ToBase64String' ne prend pas de' string', seulement un 'byte []'. – CodesInChaos

+1

Pouvez-vous montrer comment vous obtenez les données d'image dans les chaînes? Dans les deux langues s'il vous plaît. – Stephan

+0

Demandez à la personne qui a expliqué la raison, expliquez la raison pour laquelle votre code est erroné, sinon vous devez fournir le code C# et fournir des précisions. –

Répondre

3

Vous codez en base64 une chaîne ? Que veux-tu faire? Vous devez d'abord convertir la chaîne en une séquence d'octets, en choisissant un encodage tel que UTF-8 ou UTF-16. Je suppose que vous avez réussi à utiliser différents encodages des deux côtés. Java String.GetBytes() utilise le jeu de caractères par défaut (Probablement quelque chose comme Latin1 sur les versions de Windows occidentales). Pour C#, vous n'avez pas publié le code pertinent.

Pour résoudre ce problème, choisissez un encodage et utilisez-le explicitement des deux côtés. Je recommande d'utiliser UTF-8. Du côté Java, vous devriez utiliser la bonne méthode de codage, donc vous ne finirez pas avec "UTF-8 modifié", mais comme je ne suis pas un programmeur java, je ne sais pas quelles méthodes ont modifié UTF -8. Je pense cela arrive seulement si vous abusez de la méthode de sérialisation interne.

Les octets signés et non signés ne devraient pas être pertinents ici. Le tampon d'octet intermédiaire sera différent, mais la chaîne d'origine et la chaîne base64 doivent être identiques des deux côtés.

+0

vous avez raison.Il est le codage.J'ai lu le fichier image en chaîne.après avoir lu le fichier image à byte [] en ascii, le résultat est égal maintenant now.thanks – zhouxiang

5

D'abord, vous devez réaliser qu'un octet stocke 256 valeurs, qu'elles soient signées ou non. Si vous souhaitez obtenir des valeurs non signées à partir d'un octet signé (ce que Java prend en charge), vous pouvez utiliser & 0xFF

par exemple.

byte[] bytes = { 0, 127, -128, -1}; 
for(byte b: bytes) { 
    int unsigned = b & 0xFF; 
    System.out.println(unsigned); 
} 

impressions

0 
127 
128 
255 

La réponse est simple: vous n'avez pas besoin d'un octet [] qui a les mêmes valeurs. ;)

Questions connexes