java中String 和 byte[]数组转换的问题 这两天看到了java里关于数据转换的问题,有一个问题一直困扰着,希望各位大大解读一下。 字符串可以通过.getBytes()转换成字节流。我的问题也就来了,转换成byte[]数组以后,这个byte数组里存放的是什么东西,为什么要转换成byte类型的呢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这么复杂的东西还真没想过,个人理解为string里存的都是字符串 而byte[]存的都是字节也就是数字然而string类里面的编码方式不确定比如说 汉字可能占两个字节 也可能占三个字节 这就牵扯到编码解码的问题了想要知道byte[]里面,循环输出每个字节,就会发现里面全部都是数字 首先感谢你的回答,难道这种问题就我一个想知道吗我用英文字符串转换成字节流循环输出的时候就是asncii码表里的对应字母编号,但是用中文的话就各种负数了,然后也超出byte的范围了 首先感谢你的回答,难道这种问题就我一个想知道吗我用英文字符串转换成字节流循环输出的时候就是asncii码表里的对应字母编号,但是用中文的话就各种负数了,然后也超出byte的范围了就如我上面所说,一个汉字可能占两到三个字节,字节取值范围是-128 到127 、一个字节占八个比特位就比如说你用UTF-8码表,输出你好两个字 就会出现-28,-67,-96,-27,-91,-67 这就表示-28,-67,-96就在电脑里面以UTF8的形式就代表你 后三个就代表好字建议你这个东西,先放一放。这个东西牵扯到编码解码问题太多,前期没必要搞懂。并且别人做出工具是让你用的,研究原理方面是等你积累知识到一定程度后再试着理解。 个人觉得getbyte是很实用的,比如涉及到MD5的时候,就需要对字节流的加密处理,通过getbyte。如果是想得到字符,getchar也许更好。 getBytes有几个重载的方法,可以指定字符集,不同的字符集,编码方式不同,所以得到的字节数组也不同。如果不指定字符集,调用空参的方法则是系统默认编码,中文系统一般是gbk。另外数字和字母的ascii码在常见的字符集编码相同。 没想到这么简单的问题竟然没有人回你。你之所以有这个问题,是因为习惯String这种概念。而byte[]对你来说很陌生,不知如何是好。才会这样。但是byte你应该不陌生才是,它就是2^8,也就是0-255的值。ok,你又问,可是它实际是-128~127,而不是0-255。其实,只是怎么解释的罢了。你把它转成char,就是0-255了。那,到底byte[]是什么?你试过英文字符串,会转成一堆ascii。中文也差不多,会转成一堆bytes。但它不是ascii,是什么呢?这要看你给getBytes()的参数而定。在windows下默认是转成gbk,但你可以用参数转成你想转的,比如utf8,utf16le,utf16be......我知道你又不懂了。因为你不知道干嘛要转成bytes。有很多情况:保存成文件,或在网上传送………只有转成bytes才能在网上传送。没有别的办法。这点,你得慢慢适应。你只要知道以下几点即可:1.只有转成bytes才能在网上传送(或保存成文件,或……………)。2.用什么码转成bytes,就要用什么码转回String:用new String(bytes, "码的名称")3.…………(暂没想到)对bytes的操作,是程序员是很重要的技能,你慢慢学,慢慢适应,久了就习惯了。 我对7楼的回答比较满意。但是,我还是想废话几句。计算机认识的东西就是1和0,而现代计算机最小的存储单位是字节,也就是2的8次方。为什么这么设计,请自行恶补计算机原理。既然所有的东西都可以用字节表示,那字符串自然也可以用字节表示了。比如ASCII码就是用1个字节来表西文字符(也包含@#$%及Ctrl这样的非显示控制字符)比如97表示的就是小写字母a,二进制就是1100001,计算机只认识二进制数据,我们有时用十进制97来表述只是为了便于沟通。汉字因为多于256个,一个字节不够表示,所以必须用2个以上的字节来表示,至于怎么映射。就看你怎么设计了。你可以让10000000、11000000这个两个字节表示汉字‘好’,也可以表示‘坏’,完全取决于你的心情。可实际上呢?当然不能取决于你的心情,不然编码不一样,每个人都是自己的编码,互联网上的传输不统一,计算机怎么去翻译表达呢?所以,就出现了各种各样的标准编码,如gbk、utf-8.。。每个编码都有自己的特点,没有完美的编码,只有最合适的编码,想知道为什么,请自行百度。说到这,应该理解为什么要把字符串转为字节数组了吧,其实就是通过某种编码映射把字符串翻译成一组二进制数据,这些二级制数据可以存在内存里,也可以存在硬盘里,也可以通过网络(局域网或者互联网)和别人通讯,比如微信,对方接到这些二进制数据再通过约定一致的编码在本地计算机通过密码本翻译成人类认识的字符。我们平常所说的乱码,就是因为发送方在编码成二进制数据时和接收方翻译的编码标准不一样。 正数数列与负数数列在N~M范围内的所有组合 java try catch finally 用法 请问在windows系统下,如何用java程序与usb口进行通讯? 静态类有构造方法 难倒了无数人的一道线程题目 myeclipse能脱放控件吗? 哪位高手能回答:对象实例的方法存放在什么地方? junit 在测试中的System.out.println("sddfssdf");怎么无法输出来呢?但在非测试方法里可以输出来。 改变窗口大小时,对于工具栏处理! 怎么画格子? 分享一下java学习笔记 已经登录网站了,但是不知怎么用cookie访问链接,大神们帮忙出出招
这么复杂的东西还真没想过,个人理解为
string里存的都是字符串 而byte[]存的都是字节也就是数字
然而string类里面的编码方式不确定
比如说 汉字可能占两个字节 也可能占三个字节 这就牵扯到编码解码的问题了
想要知道byte[]里面,循环输出每个字节,就会发现里面全部都是数字
就比如说你用UTF-8码表,输出你好两个字
就会出现-28,-67,-96,-27,-91,-67 这就表示-28,-67,-96就在电脑里面以UTF8的形式就代表你 后三个就代表好字建议你这个东西,先放一放。这个东西牵扯到编码解码问题太多,前期没必要搞懂。并且别人做出工具是让你用的,研究原理方面是等你积累知识到一定程度后再试着理解。
而byte[]对你来说很陌生,不知如何是好。
才会这样。但是byte你应该不陌生才是,它就是2^8,也就是0-255的值。
ok,你又问,可是它实际是-128~127,而不是0-255。
其实,只是怎么解释的罢了。
你把它转成char,就是0-255了。那,到底byte[]是什么?
你试过英文字符串,会转成一堆ascii。
中文也差不多,会转成一堆bytes。
但它不是ascii,是什么呢?
这要看你给getBytes()的参数而定。
在windows下默认是转成gbk,但你可以用参数转成你想转的,比如utf8,utf16le,utf16be......我知道你又不懂了。
因为你不知道干嘛要转成bytes。
有很多情况:保存成文件,或在网上传送………
只有转成bytes才能在网上传送。
没有别的办法。
这点,你得慢慢适应。你只要知道以下几点即可:
1.只有转成bytes才能在网上传送(或保存成文件,或……………)。
2.用什么码转成bytes,就要用什么码转回String:用new String(bytes, "码的名称")
3.…………(暂没想到)对bytes的操作,是程序员是很重要的技能,
你慢慢学,慢慢适应,久了就习惯了。
但是,我还是想废话几句。
计算机认识的东西就是1和0,而现代计算机最小的存储单位是字节,也就是2的8次方。为什么这么设计,请自行恶补计算机原理。
既然所有的东西都可以用字节表示,那字符串自然也可以用字节表示了。
比如ASCII码就是用1个字节来表西文字符(也包含@#$%及Ctrl这样的非显示控制字符)
比如97表示的就是小写字母a,二进制就是1100001,计算机只认识二进制数据,我们有时用十进制97来表述只是为了便于沟通。
汉字因为多于256个,一个字节不够表示,所以必须用2个以上的字节来表示,至于怎么映射。就看你怎么设计了。你可以让
10000000、11000000这个两个字节表示汉字‘好’,也可以表示‘坏’,完全取决于你的心情。可实际上呢?当然不能取决于你的心情,不然编码不一样,每个人都是自己的编码,互联网上的传输不统一,计算机怎么去翻译表达呢?所以,就出现了各种各样的标准编码,如gbk、utf-8.。。每个编码都有自己的特点,没有完美的编码,只有最合适的编码,想知道为什么,请自行百度。
说到这,应该理解为什么要把字符串转为字节数组了吧,其实就是通过某种编码映射把字符串翻译成一组二进制数据,这些二级制数据可以存在内存里,也可以存在硬盘里,也可以通过网络(局域网或者互联网)和别人通讯,比如微信,对方接到这些二进制数据再通过约定一致的编码在本地计算机通过密码本翻译成人类认识的字符。我们平常所说的乱码,就是因为发送方在编码成二进制数据时和接收方翻译的编码标准不一样。