【问题标题】:Convert unsigned short to char将 unsigned short 转换为 char
【发布时间】:2015-08-26 14:36:19
【问题描述】:

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

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

谁能帮我解释一下?谢谢!

【问题讨论】:

  • 而转换成char*应该是转换成char
  • unsigned char * num[3]; 你知道num 的类型是什么吗?
  • 为什么不printf("System Number: %c%c\n", SYSTEM_N >> 8, SYSTEM_N & 0x00FF);?您的 “我需要...[使用] %s” 只会让它变得更难。
  • @TonyD 我使用的是 %s,即 char 字符串格式的输出。这个例子是我所拥有的简短版本。实际上有大约 50 个要输出。
  • “正在使用” - 很公平 - 但在我看来,%c%c 仍然可以让您每次都先复制到unsigned char 数组,并且效果更好。如果我是你并且做 50,我会使用宏 ala #define CC(N) N >> 8, N & 0xFF 添加 printf 参数....

标签: c++ c char


【解决方案1】:

有几个错误: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-

【讨论】:

    【解决方案2】:

    你可能打算写

    unsigned char num[3];
    

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

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

    num[2] = '\0';
    

    【讨论】:

      【解决方案3】:

      一般的解决方案可能是这样的,假设ushort_arr 在一个数组中包含unsigned shorts,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] = '\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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-20
        • 1970-01-01
        • 1970-01-01
        • 2011-06-11
        • 2012-12-22
        • 2019-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多