二进制与各种类型的数据转换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;

所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。

我们的机器究竟是大端和小端,这是有操作系统和硬件决定的。

相关文档
最新文档