二进制与各种类型的数据转换
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二进制与各种类型的数据转换
注:下面所说的都和语言无关,不管是c、c++、c#、java、objective-c,都是一样的。但是不同的语言定义数组的方式不一样,c、c++是这样的:byte temp[],java、c#是这样的:byte []temp。下面定义数组统一byte []temp方式;
1.基本知识
byte[] temp= {0,0,0,0,0,0,0,15};
在内存中存的是什么
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00001111
如何把一个整数转换为byte[]数组,以一个int整数为例;
int temp = 0x0F070301;
在内存中存放的16进制数据
0x0f x07 0x03 x01
在内存中存放的10进制数据
15 7 3 1
在内存中存放的2进制数据
00001111 00000111 00000011 00000001
2.整数转byte数组
我要把temp = 0x0F070301;转为byte数组是什么意思呢?先看temp转换为byte数组的结果。
byte[] temp1= {0x0F,0x07,0x03,0x01};
转换方法:
int temp3 = 0x0F070301&0xFF
此时temp3 就等于0x01
int temp3 = (0x0F070301>> 8)&0xFF
此时temp3 就等于0x03
依次类推即可得到数组元素的每个值。
3.byte数组转换为int类型
●c、c++的转换方式:
如何把一个byte数组转换为int类型。
这种转换在c和c++中最方便,当然在objective-c可以使用c的代码也很方便。
例如有数组
byte temp1[]= {0x0F,0x07,0x03,0x01};
因为temp1数组的指针,转换方式如下:
int* p_temp1 = (int*)temp1;
int temp1_value = *p_temp1;
此时temp1_value为0x0F070301
●其他语言的转换方式:
在所有语言(c、c++、c#、java、objective-c)中,通用的转换方式为:
byte temp1[]= {0x0F,0x07,0x03,0x01};
tmp0 =emp1[0]
tmp1= temp1[1]
tmp2 = temp1[2]
tmp3 = temp1[3]
tmp3 <<= 0;
tmp2 <<= 8;
tmp1 <<= 16;
tmp0 <<= 24;
tmp5 = tmp0 | tmp1 | tmp2 | tmp3 = 0x0F070301
4.有符号和无符号的概念
在计算机中,可以区分正负类型的数,成为“有符号数”(signed);无正负类型的数(只有整数类型),成为“无符号数”(unsigned)。简明的说,无符号说就是其所有的位数都用来表示数值的大小,有符号数除最高位来表示数值的正负外(0表示正数;1表示负数),
首先得知道最高位是哪一位?1个字节的类型,如字符类型,最高位是第7位,2个字节的数,最高位是第15位,4个字节的数,最高位是第31位。不同长度的数值类型,其最高位也就不同,但总是最左边的那位(如下示意)。字符类型固定是1个字节,所以最高位总是第7位。
(红色为最高位)
单字节数:11111111
双字节数:11111111 11111111
四字节数:11111111 11111111 11111111 11111111
八字节数:11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 当我们指定一个数是无符号类型时,那么其最高位的1或0,和其它位一样,用来表示该数的大小。
当我们指定一个数量是有符号类型时,此时,最高数称为“符号位”。为1时,表示该数为负值,为0时表示为正值。
很多语言(比如上面说到的c、c++、c#、objective-c,甚至java)的基本整数类型,都会有一个“无符号”的概念,但是java的“无符号”的概念用的太少了,因为java的所有整数类型(byte、char、short、int、long),只有char类型是“无符号”的。而我们平时太少用这个类型去表示整数了。
例如java语言:
java中char(无符号)和short(有符号)都是两个字节的。他们都可以表示一个整数。
char charvalue = 11111111 11111111
short shortvalue = 11111111 11111111
假如定义一个char类型和一个short类型,在内存中都存入上面的二进制。那么他们的整数值是多少呢?
charvalue = 65536; (正数)
shortvalue=-1; (负数)
char的值范围是(0 ~ 65535),而short的值范围是(-32768~+32767)
如果其他语言给java传了一个“无符号”整数,java程序员应该怎么处理呢?
例如:
其他语言给了一个两个字节的无符号整数:1111111111111111(65535)
java可以定义三种变量存放该值:
char charvalue= 1111111111111111
int intvalue = 0000000000000000 1111111111111111
long longvalue=0000000000000000 0000000000000000 0000000000000000 1111111111111111 上面3个值都表示65535;虽然charvalue的最高为1,当时因为是无符号的,所以可以表示65535,intvalue和longvalue的最高为是0,当时也可以表示65535.
上面都是基本概念,知道二进制在计算机的表示。java要把一个无符号整数转换为合适的有符号整数,那么只需要通过移位<<和与&操作,即可得到想要的数值。
当然,如果其他语言给了一个两个字节的有符号整数:1111111111111111,java只能定义short来存放该值。
5.大端小端概念
在写tcp协议的过程中,经常会遇到一个大端小端的问题。这是什么意思呢?假如我们要存一个int 类型的数据,int类型占4个字节。大端和小端,存放的方式是这样的:
假如:int temp = 15;
temp大端的存放在内存的中的数据是这样的:
temp :00000000 00000000 00000000 00001111
temp小端的存放在内存的中的数据是这样的:
temp :00001111 00000000 00000000 00000000
所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
我们的机器究竟是大端和小端,这是有操作系统和硬件决定的。