2010-01-06 2 views
1

Просьба предоставить некоторый код для преобразования массива char [] десятичных значений в массив байтов для большого целочисленного значения в c.преобразовать десятичный массив (str) в двоичный массив (байты)

Как я могу преобразовать этот ниже код для большого массива десятичных значений, например, я получаю результат как массив длинных байтов?

static int dec2bin (char inbuf[], int num_convert) 
{ 
    char ctemp; 
    int result, power; 

    num_convert--; /* index of LS char to convert */ 
    result = 0; 
    power = 1; 
    while (num_convert >= 0) 
    { 
    ctemp = inbuf[num_convert--]; /* working digit */ 
    if (isdigit(ctemp)) 
    { 
     result += ((ctemp-'0') * power); 
     power *= 10; 
    } 
    else 
     return(0); /* error: non-numeric digit detected */ 
    } 
    return (result); 
} 

Нет, это не просто долго значение, это действительно значение BigInteger, кто может дать простой разл к байту (бинарную логику преобразования, я заменю Int со своими реализациями BigInt и BigInt операторами (добавить, мульт) и т.д.,

Samuel правильно!

Спасибо заранее.

Для примера я могу заменить выше, как показано ниже

static int dec2bin (char inbuf[], bigint num_convert) 
{ 
    char ctemp; 
    bigint result, power; 

    num_convert--; /* index of LS char to convert */ 
    result = 0; 
    power = 1; 
    while (num_convert >= 0) 
    { 
    ctemp = inbuf[num_convert--]; /* working digit */ 
    if (isdigit(ctemp)) 
    { 
     result = bi_add(result ,(bi_mult((ctemp-'0'), power)); 
     power = bi_mult(power , 10); 
    } 
    else 
     return(0); /* error: non-numeric digit detected */ 
    } 
    return (result); 
} 

что-то вроде этого будет работать?

ответ

0

Похоже, вы ищете решение, в котором вы выполняете арифметику низкого уровня самостоятельно.

Рассматривали ли вы использование существующего пакета bignum, такого как GNU Multi Precision Arithmetic library? Достаточно легко преобразовать существующий код, если у вас есть это. Например, этот код:

result += ((ctemp-'0') * power); 
power *= 10; 

становится:

mpz_t tmp; 
mpz_init(tmp); 
mpz_mul_ui(tmp, power, ctemp - '0'); 
mpz_add(result, result, tmp); 
mpz_clear(tmp); 

mpz_mul_ui(power, power, 10); 
+0

Я думаю, что «большой» не относится к размеру чисел, только размер массива числовых строк. Я понял, что OP хочет номера в диапазоне 'long'. –

+0

@Carl - Обратите внимание, что OP пишет: «Я получаю результат как массив длинных байтов». Поскольку он запрашивает * массив * longs, он уверен, похоже, что они ищут нечто большее, чем просто длинное. –

+0

Хм. Я согласен, что это был вопрос, который неправильно понял, и ваша интерпретация правдоподобна. –

Смежные вопросы