2016-07-13 3 views
2

У меня есть функция, которая принимает unsigned char* в качестве входных данных.Преобразование целого числа в unsigned char * (int 221 to " xdd")

Скажем, например, что у меня есть:

unsigned char* data = (unsigned char*) "\xdd"; 
int a = 221; 

Как я могу преобразовать мое целое a к unsigned char* таким образом, что data и мой конвертированы a неотличима? Я пробовал играть со sprintf, но не повезло, я не уверен, как обращаться с частью «\ x».

+1

С 'sprintf()', что-то вроде 'unsigned char res [5]; sprintf (res, "\\ x% 02x", a & 0xff); '(только для младшего байта' a'). Возможно, вам не хватало '\\ x' часть строки формата? Есть и другие способы сделать это, хотя ... – Dmitri

ответ

3

Поскольку 221 не гарантированно является допустимым значением для char типа, самая близкая вещь вы можете сделать, это:

int a = 221; 
unsigned char buffer[10]; 
sprintf((char*)buffer, "%c", a); 

Вот пример программы и ее выход:

#include <stdio.h> 

int main() 
{ 
    unsigned char* data = (unsigned char*) "\xdd"; 
    int a = 221; 
    unsigned char buffer[10]; 
    sprintf((char*)buffer, "%c", a); 
    printf("%d\n", buffer[0] == data[0]); 
    printf("%d\n", buffer[0]); 
    printf("%d\n", data[0]); 
} 

Выход:

1 
221 
221 

Обновление

Возможно, я неправильно понял ваш вопрос. Вы также можете использовать:

int a = 221; 
unsigned char buffer[10] = {0}; 
buffer[0] = a; 
1

Как указано, вопрос не имеет смысла и невозможен - на самом деле вы не хотите конвертировать в const char *, который является типом указателя. Вместо этого вы хотите преобразовать в массив из char s, а затем взять адрес этого массива, используя его имя.

int x = 221; 
char buf[5]; 
snprintf(buf, sizeof buf, "\\x%.2x", x); 
/* now pass buf to whatever function you want, e.g.: */ 
puts(buf); 
+0

Надеюсь, '0 <= x <256', else' buf [] 'overflow. – chux

+0

@chux: Нет, он усекается, потому что я использовал правильную функцию 'snprintf', а не устаревшую опцию' sprintf' OP. Из контекста я понял, что целое число должно было представлять значение байта, но если это не так, то, во всяком случае, используйте больший буфер. –

+1

Основываясь на другом ответе, я не понимаю, действительно ли это то, что хотел OP. –

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