C语言中的unsigned char数组怎么转成unsigned short数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中的unsigned char数组怎么转成unsigned short数组相关的知识,希望对你有一定的参考价值。

const unsigned char gImage_23[153600] = 0X32,0X72.......
const unsigned short gImage_23[]= 0x3681,0x2AF0......
请问怎么从CHAR转成SHORT呀?是不是只要把CHAR中的两位合起来就可以了?如上面的 改成0X3272就可以了?
这是BMP转成C代码的数组。

是的改成0X3272就可以了
用左移和 按位加:
( 0x32 << 16) | 0x72
----------------------------

如果涉及 big_endian 和 little_endian 变化,则互换两个字节即可
参考技术A 发生了截断,因为unsigned
char类型只有1字节,只能保存0~255的数据,而unsigned
short
有2字节。
所以这样转换之后,unsigned
short
高2位的数据就丢失了,低2位数据被保存了。(高低位是以16进制来看的)
高低位提取:
unsigned
short
a
=
0xfeba;
int
b
=
a
&
0xff00;
/*
高2位=0xfe00
*/
int
c
=
a
&
0x00ff;
/*
低2位=0x00ba
*/
问题补充:
我用的是vb6,vb2005的ushort忘记考虑了,呵呵。
这样吧,用乘除来达到提取的目的。
检查了一下,应该这样写
高2位:变量
\
(2^8)
低2位:变量
mod
(2^8)
一字节有8个bit,所以可以表示2^8个数,就是256,用16进制表示就是0xff,刚好是2位的宽度。
假设变量是0xabcd,整除2^8,得到0xab,高2位;余除2^8,得到0xcd,低2位
不知道这样回答对不对?
参考技术B

1、移位相加即可,但是要注意unsigned short类型,需要转换为无符号数据,否则0xe8认为是负数(其实也可以定义时就为unsigned short)。

2、例程:

#include <stdio.h>
int main()

  int i, result = 0;
  unsigned short a[4] = 0x00,0x00,0x03,0xe8;//这里定义成unsigned char,那么下面就不需要强制转换了
  for (i=0; i <4; i++)
    result += (unsigned short)a[i] << ((3-i)*8);//每次都移位,数据转换为无符号
  printf("%d\\n", result);

参考技术C 1、移位相加即可,但是要注意unsigned
short类型,需要转换为无符来号数据,否则0xe8认为是负数(其实也可以定义时就为unsigned
short)。
2、例程:
#include <stdio.h>
int main()

int i, result = 0;
unsigned short a[4] = 0x00,0x00,0x03,0xe8;//这里定义成源unsigned char,那么下面就不需要强制zd转换了
for (i=0; i <4; i++)
result += (unsigned short)a[i] << ((3-i)*8);//每次都移位,数据转换为无符号
printf("%d\n", result);
参考技术D 是的改成0X3272就可以了
用左移来和
按位加:
(
0x32
<<
16)
|
0x72
----------------------------
如果涉自及
big_endian

little_endian
变化,则互换zhidao两个字节即可

以上是关于C语言中的unsigned char数组怎么转成unsigned short数组的主要内容,如果未能解决你的问题,请参考以下文章

c语言读取unsigned int

怎么用 C/C++ 把结构体数组转成 JSON串

单片机C语言怎样把double型转换为char型数据

java jni 调用 c 代码, c 中 unsigned char* 数据 如何传给java?

C++ builder中如何把unsigned char类型转换成16进制的输出

在C语言中,unsigned char是啥类型