将unsigned short转换为char

Convert unsigned short to char

本文关键字:char 转换 short unsigned      更新时间:2023-10-16

我知道有其他类似的帖子,但我认为我的帖子是不同的。我想显示一组数字。然而,它被保存为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 rn", num);

有谁能给我解释一下吗?谢谢!

有以下几个错误: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] = '';
    printf("System Number: %s rn", 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 rn",
           system_m >> 8, system_m & 0xFF, system_n >> 8, system_n & 0xFF);
    return 0;
}

程序输出:

System Number: ABC-

你可能想写

unsigned char num[3];

声明了一个包含三个char*指针的数组。

也不要忘记设置结束NUL字符,在打印之前:

num[2] = '';

一般的解决方案可能是这样的,假设ushort_arr包含一个数组中的unsigned short s, ushort_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] = '';
printf("string is: %sn", str);
free(str);

如果您只想打印一次,那么在没有内存管理的情况下可能会更有效:

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