2017-01-22 22 views
1

У меня есть ситуации, когда у меня есть массив шестнадцатеричных символов вроде следующего:Преобразовать шестнадцатеричный массив в C долго в C в строку в 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; 

выше код на C. Мне нужно преобразовать этот массив в длинном значении. Затем длинное значение должно быть отправлено в код Java, где его нужно преобразовать в строку.

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

Конечной целью является, чтобы получить строку в Java инициализирован, как показано ниже:

// Java code 
String goal = "b2002779"; 

Что бы рекомендуемый способ сделать это?

Я попытался преобразовать массив символов C в длинный, используя этот answer, но он вернул 0. Любые другие предложения?

+0

Я предлагаю вам использовать 'unsigned char', если' 0xb2' не будет отрицательным. 'long' подписан. –

+0

Когда вы говорите 'long', это C' long' (32 бита) или Java 'long' (64 бит)? – Aubin

+2

NB: ваш входной массив не является «шестнадцатеричным символом». Это было так, как вы определили его как читаемый по-человечески. Массив 'unsigned char' ничего не знает о hex, это двоичные значения. Если вы хотите, чтобы «шестнадцатеричные символы» определялись как строка и передавали эту строку в java. 'char myhex [] =" b2002779 ";' –

ответ

1

Можно добавить эти беззнаковые значения полукокса с использованием sprintf, а затем преобразовать к основанию 10 long использования 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); 

затем с 32 или 64 битным значением (в зависимости от системы) в базе 10 в Java , вы можете использовать Integer.toHexString для преобразования в шестнадцатеричную строку.

0

Вы можете сделать преобразование на стороне C++. Используйте что-то вроде следующего.

#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; 
}