2015-08-26 3 views
0

Я знаю, что есть другие сообщения вроде этого, но я думаю, что у меня разные. У меня есть группа чисел, которые я хочу отобразить. Тем не менее, он сохраняется как unsigned short. Поскольку это дается мне из сетевого буфера, все мои данные имеют неподписанный короткий формат. Итак, для серийного номера, начинающегося с «ABC-», два беззнаковых шорт будут содержать 0x4142 и 0x432D (уже в формате ASCII). Мне нужно преобразовать их, чтобы набирать char для отображения с использованием printf и% s, но для остальной части моей системы они должны оставаться как unsigned short. Это то, что я пробовал до сих пор, но выход пуст:Convert unsigned short to char

unsigned char * num[3]; 

num[0] = (unsigned char*)(SYSTEM_N >> 8); 
num[1] = (unsigned char*)(SYSTEM_N & 0x00FF); 
printf("System Number: %s \r\n", num); 

Может ли кто-нибудь пролить свет на это для меня? Благодаря!

+0

и преобразования в уголь * должно быть преобразование на символ – SergeyA

+1

'неподписанные символ * Num [3]; вы получаете то, что является типом 'num'? – ameyCU

+0

Почему бы не 'printf (« Системный номер:% c% c \ n », SYSTEM_N >> 8, SYSTEM_N & 0x00FF);'? Ваш * «Мне нужно ... [use]% s» * просто усложняет работу. –

ответ

2

Вы, вероятно, хотели написать

unsigned char num[3]; 

, как у вас есть, вы объявляете массив, содержащий три char* указатели.

Также не забудьте установить закрывающий NUL характер, перед печатью:

num[2] = '\0'; 
+0

Спасибо, что решил. –

4

Есть несколько ошибок: 1) массив является слишком коротким, 2) определение массива как массив указателей и 3), не прерывая строку.

#include <stdio.h> 

int main (void) 
{ 
    unsigned short system_m = 0x4142; 
    unsigned short system_n = 0x432D; 
    unsigned char num[5]; 

    num[0] = system_m >> 8; 
    num[1] = system_m & 0xFF; 
    num[2] = system_n >> 8; 
    num[3] = system_n & 0xFF; 
    num[4] = '\0'; 
    printf("System Number: %s \r\n", num); 

    return 0; 
} 

EDIT в качестве альтернативы, если вы не хотите, чтобы сохранить строку, просто отображать информацию с этим:

#include <stdio.h> 

int main (void) 
{ 
    unsigned short system_m = 0x4142; 
    unsigned short system_n = 0x432D; 
    printf("System Number: %c%c%c%c \r\n", 
      system_m >> 8, system_m & 0xFF, system_n >> 8, system_n & 0xFF); 
    return 0; 
} 

выход программы:

System Number: ABC- 
0

общее решение может что-то вроде этого, предполагая, что ushort_arr содержит unsigned short s в массиве, и ushort_arr_size указывает на это s размер.

char *str = malloc(ushort_arr_size * 2 + 1); 
// check if str == NULL 

int j = 0; 
for (int i = 0; i < ushort_arr_size; i++) { 
    str[j++] = ushort_arr[i] >> 8; 
    str[j++] = ushort_arr[i]; 
} 
str[j] = '\0'; 

printf("string is: %s\n", str); 

free(str); 

Хотя, возможно, это могло бы быть более эффективным, без управления памятью, если вы хотите напечатать его один раз:

for (int i = 0, j = 0; i < ushort_arr_size; i++) { 
    putchar(ushort_arr[i] >> 8); 
    putchar(ushort_arr[i] & 0xFF); 
}