将unsigned short转换为char

时间:2015-08-26 14:36:20

标签: c++ c char

我知道还有其他这样的帖子,但我认为我的不同。我有一组我希望展示的数字。但是,它保存为unsigned short。正如它是从网络缓冲区给我的,我的所有数据都是无符号的短格式。因此,对于以“ABC-”开头的序列号,两个无符号短路将保持0x4142和0x432D(已经是ASCII格式)。我需要将那些转换为char类型以使用printf和%s进行显示,但对于我的系统的其余部分,它们需要保持为unsigned short。这是我到目前为止所尝试的,但输出是空白的:

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);

任何人都可以为我阐明这一点吗?谢谢!

3 个答案:

答案 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;
}

编辑或者,如果您不想保留字符串,只需显示以下信息:

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

答案 1 :(得分:2)

你可能打算写

unsigned char num[3];

如你所知,你声明一个包含三个char*指针的数组。

另外不要忘记在打印之前设置关闭NUL字符:

num[2] = '\0';

答案 2 :(得分:0)

一般解决方案可能是这样的,假设ushort_arr包含数组中的unsigned shortushort_arr_size表示其大小。

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