2017-01-22 3 views
1

J'ai une situation où j'ai un tableau de caractères hexadécimaux comme ce qui suit:Convertir tableau hexagonal en C et à long en C à chaîne en Java

// C code 
char arr[4]; 
// Using printf with 0x%02x format specifier, I can see the following contents: 
arr[0] --> 0xb2; 
arr[1] --> 0x00; 
arr[2] --> 0x27; 
arr[3] --> 0x79; 

Le code ci-dessus est en C. Je dois convertir ce tableau en une valeur longue. La valeur longue doit ensuite être envoyée dans le code Java, où elle doit être convertie en chaîne.

C array ---> long value ---> Java String 

L'objectif final est d'obtenir une chaîne en Java initialisé comme indiqué ci-dessous:

// Java code 
String goal = "b2002779"; 

Quelle serait la méthode recommandée pour le faire?

J'ai essayé de convertir le tableau C char en long en utilisant ce answer, mais il a retourné 0. D'autres suggestions?

+0

Je vous suggère d'utiliser 'unsigned char' sauf si' 0xb2' est censé être négatif. 'long' est signé. –

+0

Quand vous dites 'long', est-ce un' long' (32 bits) ou un Java 'long' (64 bits)? – Aubin

+2

NB: votre tableau d'entrée n'est pas un "caractère hexadécimal". C'est ainsi que vous l'avez défini comme humainement lisible. Un tableau 'unsigned char' ne sait rien sur hex, ce sont des valeurs binaires. Si vous voulez des "caractères hexadécimaux", définissez-les comme une chaîne et passez cette chaîne à Java. 'char myhex [] =" b2002779 ";' –

Répondre

1

Vous pouvez ajouter ces valeurs unsigned char à l'aide sprintf, puis le convertir à une base 10 long en utilisant atol

unsigned char b[] = { 0xb2, 0xa1, 0xc3 }; 

char s[20]; 
sprintf(s, "%d%d%d", b[0], b[1], b[2]); 

long n = atol(s); 

Puis, avec la 32 ou 64 valeur binaire (selon votre système) dans la base 10 en java , vous pouvez utiliser Integer.toHexString pour convertir en chaîne hexadécimale.

0

Vous pouvez effectuer la conversion du côté C++. Utilisez quelque chose comme ce qui suit.

#include <stdio.h> 
#include <string.h> 

char map[16]; 

void convert(unsigned short decimal, char* buffer) { 
    if (decimal > 255) { 
    return; 
    } else if (decimal < 16) { 
    buffer[0]='0'; 
    buffer[0]=map[decimal]; 
    } else { 
    unsigned short remainder=decimal%16; 
    unsigned short multiplier=(decimal-remainder)/16; 
    buffer[0]=map[multiplier]; 
    buffer[1]=map[remainder]; 
    } 

    printf("conversion %d to %s\n", decimal, buffer); 
} 

int main(int argc, char** argv) { 
    map[0]='0'; 
    map[1]='1'; 
    map[2]='2'; 
    map[3]='3'; 
    map[4]='4'; 
    map[5]='5'; 
    map[6]='6'; 
    map[7]='7'; 
    map[8]='8'; 
    map[9]='9'; 
    map[10]='A'; 
    map[11]='B'; 
    map[12]='C'; 
    map[13]='D'; 
    map[14]='E'; 
    map[15]='F'; 

    unsigned short arr[4]; 
    arr[0] = 0xb2; 
    arr[1] = 0x00; 
    arr[2] = 0x27; 
    arr[3] = 0x79; 

    printf("%i.%i.%i.%i\n", 
     arr[0], 
     arr[1], 
     arr[2], 
     arr[3]); 

    static char buffer[9]; 

    for(int x=0; x<4; x++) { 
    static char buffer1[3]; 
    memset(buffer1, 0, sizeof(buffer1)); 
    convert(arr[x], buffer1); 
    strcat(buffer, buffer1); 
    } 

    printf("%s\n", buffer); 

    return 0; 
}