文档章节

Java数据类型之byte和char

秋风醉了
 秋风醉了
发布于 2014/05/15 23:32
字数 1911
阅读 245
收藏 0

 1 bit = 1 个二进制位

 1 byte = 8 bit

基本数据类型

Java基本数据类型

int     32bit

short   16bit

long    64bit

byte    8bit

char    16bit

float   32bit

double  64bit

 

位(bit)

比特(英语:Bit),亦称二进制位,指二进制中的一位,是信息的最小单位。Bit是Binary digit(二进制数位)的缩写,由数学家John Wilder Tukey提出(可能是1946年提出,但有资料称1943年就提出了)。这个术语第一次被正式使用,是在香农著名的论文《通信的数学理论》

一个比特表示开/关、真/假之类的二选一的情形没有问题,但我们经常还要面对更多选项,表示更复杂的事物。为此,可以使用一组比特,然后为不同的0和1的组合赋予不同的含义。比如,可以用两个比特来表示大学四年:新生(00)、大二(01)、大三(10)和毕业班(11)。如果再多考虑一种情况,比如研究生,那两个比特就不够用了,因为两个比特只有4种组合,没有第五种可能。但是三个比特没问题,实际上三个比特能表示8种不同的情况,这样我们就可以把教师、教工和博士后都包含进来。三个比特的全部组合为:000、001、010、011、100、101、110和111。

比特数与它们所能表示的情况数之间有一个关系,很简单:N 个比特能表示2的N次方种组合,2(乘N 次)‍。‍

 

字节(byte)

在所有现代计算机中,数据处理及内存组织的基本单位都是8个比特。8比特被称为1字节,而字节(byte)这个词是由IBM的计算机设计师维尔纳•巴克霍尔兹

(Werner Buchholz)在1956年发明的。一个字节可以编码256个不同的值(2的8次方,即8个0和1的所有不同组合),这个值可以是一个0到255间的整数,也可以是ASCII字符集中的一个字符,或者其他什么。通常,为了表示更大或更复杂的数据,需要用到多个字节的字节组。两个字节有16比特,也就是16位,可以表示0到2的16次方-1(65535)之间的数值。两个字节也可以表示Unicode字符集中的一个字符。

 

对MD5串(十六进制字符串)的操作

示例:将十六进制字符串存为字节数组,可以节省存储空间

0499AFA3432E9F2EBD81C134C1F5E4B3(这是一个MD5串)

如果把这个MD5串直接存为字符串,就是32个字节(byte),就是256二进制位。

如果把MD5串的每个字符用16进制字符来表示,那么用二进制位就会表示成4个二进制位,总共是128位,也就是16个字节。那么节省了一半的存储空间。

一个字节可以表示两个16进制字符。

import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;

/**
 * Created with IntelliJ IDEA.
 * User: ASUS
 * Date: 14-6-27
 * Time: 上午2:02
 * To change this template use File | Settings | File Templates.
 */
public class TestGG {

    public static byte[] charsToBytes(char[] src) {
        CharBuffer charBuffer = CharBuffer.allocate(src.length);
        charBuffer.put(src);
        charBuffer.flip();
        Charset cs = Charset.defaultCharset();
        System.out.println(cs.name());
        ByteBuffer byteBuffer = cs.encode(charBuffer);
        return byteBuffer.array();
    }

    public static void main(String args[]) throws Exception{
        String md5 = "0499AFA3432E9F2EBD81C134C1F5E4B3";
        System.out.println(md5);
        System.out.println(md5.length());   //32
        System.out.println(md5.getBytes().length); //32
        System.out.println(md5.toCharArray().length); //32
        System.out.println(charsToBytes(md5.toCharArray()).length); //64

        String hello = "测试字符测试字符测试字符测试字符测试字符测试字符测试字符测试字符";
        System.out.println(hello);
        System.out.println(hello.length()); //32
        System.out.println(hello.getBytes().length); //64
        System.out.println(hello.toCharArray().length);//32
        System.out.println(charsToBytes(hello.toCharArray()).length);//64
    }
}

 

运行结果:(环境,windows,jdk1.7)

E:\test-java>javac -encoding utf-8 TestGG.java

 

E:\test-java>java TestGG

0499AFA3432E9F2EBD81C134C1F5E4B3

32

32

32

GBK

64

测试字符测试字符测试字符测试字符测试字符测试字符测试字符测试字符

32

64

32

GBK

64

 

E:\test-java>

补充:

MD5串全是字母和数字,都可以用ASCII码来表示,即一个字节,所以其字节数组的长度是32。

汉字的字符串——汉字是用两个字节编码的,所以其字节数组的长度是64。

在Java中,字符数组转换成字节数组,如果字符是用GBK编码,那么字节数组的长度是字符数组的两倍。

同理,如果字符是ASCII编码,那么一个字符就是一个字节的长度,也就是说字节数组和长度和字符数组的长度一样。

 

 

 

 

 

看代码,如果这个函数的内容是这样:

public static byte[] charsToBytes(char[] src) {
    CharBuffer charBuffer = CharBuffer.allocate(src.length);
    charBuffer.put(src);
    charBuffer.flip();
    Charset cs = Charset.forName("ASCII");
    System.out.println(cs.name());
    ByteBuffer byteBuffer = cs.encode(charBuffer);
    return byteBuffer.array();
}

 

那么上面main函数的结果是这样的:

E:\test-java>java TestGG

0499AFA3432E9F2EBD81C134C1F5E4B3

32

32

32

US-ASCII

32

测试字符测试字符测试字符测试字符测试字符测试字符测试字符测试字符

32

64

32

US-ASCII

32

下面的代码是把hexString存为字节数组

public static byte[] hexStringToBytes(String hexString) {
    if (hexString == null || hexString.equals("")) {
        return null;
    }
    hexString = hexString.toUpperCase();
    int length = hexString.length() / 2;
    char[] hexChars = hexString.toCharArray();
    byte[] d = new byte[length];
    for (int i = 0; i < length; i++) {
        int pos = i * 2;
        d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
    }
    return d;
}

public static byte charToByte(char c) {
    return (byte) "0123456789ABCDEF".indexOf(c);
}

@Test
public void test8() {
    String md5 = "0499AFA3432E9F2EBD81C134C1F5E4B3";
    System.out.println(md5.getBytes().length);
    System.out.println(hexStringToBytes(md5).length);
}

 

运行结果:

32

16

 

Java中的byte和char

  1. byte 是字节数据类型 ,是有符号型的,占1 个字节;大小范围为-128—127 

  2. char 是字符数据类型 ,是无符号型的,占2字节(Unicode码 );大小范围 是0—65535 ;char是一个16位二进制的Unicode字符JAVA用char来表示一个字符

 

C语言中char

C语言中char在32位和64位编译器中都是一个字节

字符型(Char)用于储存字符(Character),如英文字母或标点。严格来说,Char 其实也是整数类型(Integer Type),因为 Char 类型储存的实际上是整数,而不是字符。计算机使用特定的整数编码来表示特定的字符。美国普遍使用的编码是 ASCII(American    Standard    Code   For    Information   Interchange  美国信息交换标准编码)。例如:ASCII 使用 65 来代表大写字母 A,因此存储字母 A 实际上存储的是整数65

 

Java中的byte

byte b1 = -128;

byte b2 = 127;

byte b3 = 'a';

byte b4 = 'A';

@Test
public void test() throws Exception {

    /**
     * 一个byte型整数在内存中占8位,也就是一个字节. 表数范围:-128--127
     * (字符类型char 2个字节)
     */
    /**
     * byte错误的定义
     * byte b1 = -129;
     * byte b2 = 128
     * byte的范围 -129~128
     * 1 byte=8 bit
     */
    //byte的范围
    byte b1 = -128;
    byte b2 = 127;
    byte b3 = 'a';
    byte b4 = 'A';
    System.out.println(b1);    //-128
    System.out.println(b2);    //127
    System.out.println(b3);    //97
    System.out.println(b4);    //65

    int a = 127;
    //int->byte的强制类型转换
    byte b5 = (byte) a;
    System.out.println(b5);        //127

    char c = (char) -1 & 0xFF;
    char d = (char) -1;
    System.out.println((int) c);     //输出255
    System.out.println((int) d);     //输出65535
}

 

 

InputStream的read()方法

/**
 * read()方法
 * Reads a byte of data from this input stream. This method blocks
 * if no input is yet available.
 * 返回值 the next byte of data, or <code>-1</code> if the end of the file is reached.
 * <p/>
 * 该函数返回一个int类型,范围从0至255,如果到达流末尾,返回-1。
 * 通过ByteArrayInputStream的源码可以看到是如何从byte转到int
 * public synchronized int read() {
 *      return (pos < count) ? (buf[pos++] & 0xff) : -1;
 * }
 */
@Test
public void test1() throws Exception {
    FileInputStream in = new FileInputStream("E:\\key\\test.txt");
    FileOutputStream out = new FileOutputStream("E:\\key\\test2.txt");

    /**
     * 返回值为下一个字节,如果没有数据,返回-1
     */
    int temp;
    while ((temp = in.read()) != -1) {
        /**
         * 参数: the byte to be written.
         */
        out.write(temp);
    }
}

 

 

& 0xFF

因为byte的取值范围是 -128~127,而Char是0~65535
所以需要& 0xFF 使得byte原来的负值变成正的

============END============

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 236
博文 577
码字总数 418437
作品 0
朝阳
程序员
jdbc对SqlServer以及java数据类型映射表(很有用的)

数据类型映射 下表列出了基本 SQL Server、JDBC 和 Java 编程语言数据类型之间的默认映射: SQL Server 类型 JDBC 类型 (java.sql.Types) Java 语言类型 bigint BIGINT long timestamp binar...

林家的人
2014/05/19
0
1
Android NDK开发之Jni的数据类型

在前面的一篇博客《Android NDK开发简介》,我简单地说明了Android NDK开发的流程,以及其重要的一环:JNI层得开发。今天我再详细说明一下自己的学习经验。 JNI是Java代码和C/C++代码通信的桥...

zhiweiofli
2013/03/15
0
0
Java开发每日复盘2018_0514

今天主要跟大家分享3个部分: 一、「Java的核心机制」 二、「Java命名规范」 三、「Java数据类型相关」 下面我们来一个一个的说: 「Java核心机制」 Java是一种强制面向对象的解释型语言(O...

ZeroOSTalk
05/14
0
0
Java小白进阶笔记(2)-变量和数据类型

1.Java有多少种数据类型,数据类型的分类? 两种数据类型: 基本数据类型 引用数据类型 除了八种基本数据类型,其他的都是引用数据类型。 2.Java的工作机制? Java程序的源代码(.java)编译...

阿里云云栖社区
05/25
0
0
第十九节:Java基本数据类型,循环结构与分支循环

基本数据类型 Java中的基本数据类型,有8种,在Java中有四种类型,8种基本数据类型。 字节 boolean 布尔型为1/8 byte 字节类型为1 short 短整型为2 char 字符型为2 int 整数类型为4 float 浮...

达叔小生
08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

redis 系列一 -- 简介及安装

1.简介 redis -- remote dictionary server 远程字典服务 使用 C 语言编写; 高性能的 key-value数据库; 内存数据库,支持数据持久化。 Redis 是一个开源(BSD许可)的,内存中的数据结构存...

imbiao
35分钟前
1
0
nginx log记录请求响应时间

有时为了方便分析接口性能等,需要记录请求的时长,通过修改nginx的日志格式可以做到,如 添加一个新的log_format log_format timed_combined '$remote_addr - $remote_user [$time_local] "...

swingcoder
58分钟前
2
0
Spring MVC之RequestMappingHandlerMapping匹配

对于RequestMappingHandlerMapping,使用Spring的同学基本都不会陌生,该类的作用有两个: 通过request查找对应的HandlerMethod,即当前request具体是由Controller中的哪个方法进行处理; 查...

爱宝贝丶
今天
2
0
Java Web--增删改查之二界面后台java代码(转载参考)

/** *  *//** * @author Administrator * */package dao; import java.sql.*;public class DBConn {/** * 链接数据库 * @return */  ...

小橙子的曼曼
今天
4
0
Redis源码阅读笔记-对象及其类型和编码

总结之《Redis设计与实现》 对象 Redis中是使用对象来便是数据库中的键和值。 结构 // server.h...#define LRU_BITS 24...typedef struct redisObject { unsigned type:4; ...

Jian_Ming
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部