`
rain_2372
  • 浏览: 675811 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

c语言中unsigned类型和普通类型间的转换

    博客分类:
  • c
阅读更多
遇到了协议的加密解密和封装,其中经常遇到unsigned类型的数据和普通数据类型间转来转去,所以经过研究,简单封装了几个函数,在这里分享给大家,有不足之处还望大家给予指正。

unsigned short unCharToUnShort(unsigned char* pBuf)
{
unsigned short result = 0;
result = (short)pBuf[0]*256;
result += (short)pBuf[1];
return result;
}

unsigned int unCharToUnInt(unsigned char* pBuf)
{
unsigned int result = 0;
result = (short)pBuf[0]*256*256*256;
result += (short)pBuf[1]*256*256;
result += (short)pBuf[2]*256;
result += (short)pBuf[3];
return result;
}

  以上两个函数是把unsigned char*转换为unsigned short或unsigned int,数据的存放方式为高字节在前,低字节在后,比如无符号短整型256是0x01 0x00。我们通过依次获取低位的数据然后乘以0xFF,来获取低位所代表的整数值,然后再把各个位的值相加,得出最终需要的无符号整形值。其中把一个字节强转为short型,就是为了获取该字节的无符号整型值,因为一个short值占两个字符,我们这样强转,其实只用了short高位的那一个字节。

void unShortToUnChar(unsigned char* pBuf,unsigned short iValue)
{
pBuf[0] = (unsigned char)(iValue>>8);
pBuf[1] = (unsigned char)(iValue);
}

void unIntToUnChar(unsigned char* pBuf,unsigned int iValue)
{
pBuf[0] = (unsigned char)(iValue>>24);
pBuf[1] = (unsigned char)(iValue>>16);
pBuf[2] = (unsigned char)(iValue>>8);
pBuf[3] = (unsigned char)(iValue);
}

  以上两个函数作用是把无符号整形转换为unsigned char型。所使用的方式是把整型值右移8的倍数,然后取高位强转为unsigned char后赋值给我们的unsigned char数组中的各个字节。

  在做无符号数据类型和有符号数据类型转换的时候方式有很多,此处介绍的是我觉得比较简单且易懂的,代码已在VS和linux下测试通过。大家如果有更好的方式,欢迎跟帖交流,我好对本文章进行更新,方便其它同仁学习。
分享到:
评论
2 楼 qq981378640 2015-10-26  
#include <stdio.h>

int main()
{
    unsigned int result = 0;
    unsigned char *p = (unsigned char *)&result;
    p[3] = 0x00;
    p[2] = 0x02;
    p[1] = 0x00;
    p[0] = 0x00;
    printf("result = %u\n", result);
    printf("result = %u\n", result);
    return 0;
}


1 楼 qq981378640 2015-10-26  
楼主你这样有点复杂了,直接这样写更好更方便
#include <stdio.h>

int main()
{
    unsigned int result = 0;
    unsigned char *p = (unsigned char *)&result;
    p[2] = 0x02;
    p[1] = 0x00;
    p[0] = 0x00;
    printf("result = %u\n", result);
    printf("result = %u\n", result);
    return 0;
}

相关推荐

    C语言中unsigned、类型转换与程序的可移植性.pdf

    C语言中unsigned、类型转换与程序的可移植性

    详解C语言的类型转换

    1、自动类型转换  ● 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128~127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围是0~255(有些机器把char型当做unsighed char...

    浅谈c语言中类型隐性转换的坑

    谨记:在C语言中,当两种不同类型之间运算时,低字节长度类型会向高自己长度类型转换,有符号会向无符号类型转换。 举例子如下: #include void func(void) { int i = 1; unsigned char c1 = 1; signed char c2...

    基于C语言char与unsigned char的区别介绍

    在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别。 首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,...

    C语言宏定义技巧(常用宏定义)

    2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。 typedef unsigned char boolean; /* Boolean value type. */ typedef unsigned long int uint32; /* Unsigned 32...

    C语言中的所有关键字

    (1) char :声明字符型变量或函数 (2) double :声明双精度变量或函数 ...(11) unsigned:声明无符号类型变量或函数 (12) void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)

    C语言解析教程(原书第4版)(美) 凯利.pdf

    3.11 隐式类型转换和强制类型转换 3.11.1 整型提升 3.11.2 寻常算术转换 3.11.3 强制类型转换 3.12 十六进制和八进制常量 3.13 总结 3.14 练习 第4章 控制流 4.1 关系操作符、相等操作符和逻辑操作符 4.2 关系操作符...

    详解C语言中的char数据类型及其与int类型的转换

    C语言中的char变量 char是C/C++整型数据中比较古怪的一个,其它的如int/long/short等不指定signed/unsigned时都默认是signed。虽然char在标准中是unsigned(因为char类型提出的初衷是用来表示ascii码,ascii码的范围...

    float、int、unsigned int数据与其在实际内存中表示的相互转换小程序

    float、int、unsigned int数据与其在实际内存中表示的相互转换小程序

    C语言类型转换

     类型转换是C语言中常识性的知识点,但不注意又会有让人迷惑的时候,来看一道笔试题:  以下两个程序片段A和B,问那个for循环能运行?  A:  -------------------------------------------------------------...

    c语言中十六进制转二进制显示的实现方法

    代码如下://====================================== //输出格式: hex2bin 5e. //得到: 0101 1110 ...int main(int argc, char **argv){ unsigned char value; char *pointer; char ebits[CHAR_BIT

    c语言入门教程.txt

    这些数据类型我们在本节和后面的章节中都会陆陆续续介绍。 那么变量我们总要给它取个名字吧,这个名字我们叫做标识符。 标识符的命名有一定的规则: (1).标识符只能由字母、数字和下划线三类字符组成 (2).第一个字符...

    EDA/PLD中的C语言类型转换

     类型转换是C语言中常识性的知识点,但不注意又会有让人迷惑的时候,来看一道笔试题:  以下两个程序片段A和B,问那个for循环能运行?  A:  -------------------------------------------------------------...

    C语言常用宏定义技巧

    C语言常用宏定义技巧!

    如何把char str,或unsigned char str转换成CString

    如何把char str,或unsigned char str转换成CString

    QString含汉字时,完美转char*和unsigned char*

    此为QString无损转char*和unsigned char* 。 当QString内容包含汉字时,转换char*等会发生失败。此接口解决了该问题。使用后char*与unsigned char*的qDebug()输出与QString输出结果相同。 注意,该函数返回unsigned ...

    unicode 转换为 gb2312.txt

    这是unicode跟对应的GB2312编码的转换表,同时也是二维数组,可以直接在c语言中使用,数组左列为unicode,根据unicode的数值大小从小到大进行排序,右列为对应的GB2312编码,旁边有注释对应的汉字,亲测可以在单片机...

    s扫描器c语言源代码

    s扫描器C语言源代码 typedef struct _iphdr { unsigned char h_lenver; //4位首部长度+4位IP版本号 unsigned char tos; //8位服务类型TOS unsigned short total_len; //16位总长度(字节) unsigned ...

    c语言程序设计标准教程

    如一定要把数值赋予枚举变量,则必须用强制类型转换,如: a=(enum weekday)2;其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于: a=tue; 还应该说明的是枚举元素不是字符常量也不是字符串常量, 使用时不要加单...

    C语言合并多个char *类型的字符串

    main.c为测试文件,调用tools.h中的函数: char * MultiCombine(char *a[],int num); 编译方法:gcc -o test main.c tools.c

Global site tag (gtag.js) - Google Analytics