IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Convertir des long issus de C++ en long pour java


Sujet :

Entrée/Sortie Java

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Par défaut Convertir des long issus de C++ en long pour java
    Bonjour,

    je dois lire des fichiers produits par une appli c++ avec mon applet.

    Pour le moment les fichiers en question ne contiennent que des int windows. Pour les utiliser en java j'inverse l'odre des bytes et comme ça j'ai mon int java.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public static int MSInt2JavaInt(int i)
    {
    	//inverser l'ordre des bytes
    	return (int)((i>>>24)|((i&0x00FF0000)>>>8)|((i&0x0000FF00)<<8)|(i<<24));
    	}
    Ca marche très bien mais pour des raison de dépassement de taille des int je dois lire des long.

    Comment adapter mon code existant pour convertir des long ?

    Merci a tous

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    la librairie jakarta commons io contient une classe EndianUtils qui peux t'aider à faire toutes sortes de conversions.

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 899
    Billets dans le blog
    54
    Par défaut
    java.nio contient egalement ce qu'il faut pour lire des donnees little endian (voir java.nio.ByteOrder.LITTLE_ENDIAN) sans devoir passer par une lib externe.

    Sinon il t'est aussi possible de passer par la representation binaire du nombre, cette representation etant une chaine de charactere ne contenant que des '0' et des '1'. Evidement ca peut etre plus long.

    Quant aux depassements, hum, vi tes entiers C++ ne sont pas signes j'imagine. Tu peux donc passer par des long comme tu fais mais tu peux aussi essayer un BigDecimal.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    long en C++ c'est vague, il peut être codé sur 1, 2, 4 ou 8 bytes, en LE comme en BE. Tout dépend de l'implémentation et du processeur sur lequel le logiciel a été compilé et le compilateur lui même.

    Pour faire quelque chose de portable, il faut que tu définisses tes types en C++ pour qu'ils fassent exactement la taille souhaitée. Ensuite, il faut que tu les codes exactement de la manière que tu veux. Si c'est un codage à la Java que tu veux, alors un long en Java est codé sur 8 bytes en BigEndian.

    Les types int64_t sont codés sur 8 bytes. Si ce type n'existe pas sur ta plateforme, tu peux essayer "long long", qui devrait être sur 8 bytes. Selon que tu sois sous Windows ou sous Linux et selon ton compilateur et ton architecture, ça change toutes façons, la norme C++ ne définit rien là dessus.

    Tu peux utiliser ceci pour faire passer ton long long en big endian/little endian (C++):

    Attention, sur mon architecture, les long long sont codés par défaut en LE, ça peut ne pas être le cas chez toi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #define switch_endianess(x) \
    ((((x) & 0xff00000000000000LL) >> 56) | \
    (((x) & 0x00ff000000000000LL) >> 40) | \
    (((x) & 0x0000ff0000000000LL) >> 24) | \
    (((x) & 0x000000ff00000000LL) >> 8) | \
    (((x) & 0x00000000ff000000LL) << 8) | \
    (((x) & 0x0000000000ff0000LL) << 24) | \
    (((x) & 0x000000000000ff00LL) << 40) | \
    (((x) & 0x00000000000000ffLL) << 56))
    Ensuite, côté Java, tu n'as plus qu'à lire un long.

Discussions similaires

  1. Détecter des phrases en double dans un long document
    Par locweb dans le forum VBA Word
    Réponses: 7
    Dernier message: 28/07/2021, 21h24
  2. Réponses: 0
    Dernier message: 28/07/2011, 07h46
  3. Suppression des doublons d'un ListBox très long !
    Par benymypony dans le forum Débuter
    Réponses: 34
    Dernier message: 23/07/2011, 10h00
  4. [WD7.5] Importation des données Excel vers HF tres long
    Par chuba dans le forum WinDev
    Réponses: 10
    Dernier message: 23/06/2010, 16h27
  5. convertir une valeur stocké sur 4 unsigned long en décimal
    Par juanito003 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/12/2007, 20h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo