用的win10同样没发现,现在好像win10没有这个bug了
概括一下就是说记事本能解析出来就是通过编码的作用是吗?二进制-->编码表-->记事本解析出中文
个人理解在for循环的时候把byte元素传到Integer.toHexString(b&0xff)的时候byte会自动转型成int类型,由于int类型是32位然后& 0xff 就是把前面24个0去掉只要低8位,最后打印出来的就是只保留低8位的形式
不是付费的课,讲师一般都不回复,而且讲这个课的是很久前的事,基本不会出新课
你不是已经得到了结果吗? 使用Integer.toHexString就已经把字节转换成了以16进制显示的方式 这里又使用
&0xff把前面24个没用的0去掉,这就变成你控制台输出的那些了
b & 0xff,这个是必须的吗,就算我不加& 0xff,也到的结果也是一样的。
utf-8吧?
没有更好
不要用文本文档写东西
打出fore,同时按快捷键alt+/,出现选项,正常会在第一个,直接按enter就出来了
这是和IDE工具相关的,你可以设置 默认utf-8 or 其他
方便显示和运算
可能没权限,你右键用管理员权限运行下试试看
你的项目默认是utf-8编码,而老师的默认是gbk编码,这个是可以改的
正如你所说,byte只有8位,然后int有32位,所以byte转换为int,int的前面24位是无意义的(就是跟转换过来的值无关),所以0xff=0000 0000 0000 0000 0000 0000 1111 1111 & b可以保留后8位的数值,前面24位不管是0还是1都会为0不显示。
f是16进制数,ffffffc4 化为二进制就是1111 1111 1111 1111 1111 1111 1100 0100 ;0xff化为二进制是1111 1111;&是按位与,ffffffc4 & 0xff 时0xff高位补0, 最后得到的二进制数是0000 0000 0000 0000 0000 0000 1100 0100,转化为16进制就是0xc4,高位的0忽略掉
先建一个文本文件,然后进入这个文本文件打一个联字,再保存再进入,你会发现乱码,因为联这个字是很巧合的被utf-8识别存储的,如果你建完文件直接打联,再保存就不会乱码了,因为它被存储为ansi了
对于中文字符,UTF-8编码要用三个字节进行编码,因此,如果你使用记事本录入“联通”,然后选择以UTF-8编码方式保存的话,文件大小应为9个字节(包含三个字节的开头数据),而同样的文件GBK编码却是4个字节。最后附上“联通”的GBK、UTF-8、Unicode编码值,以及记事本的错误思维。
联通 GBK C1 AA CD A8 UTF-8 E8 81 94 E9 80 9A Unicode 54 80 1A 90
联通 GBK C1 AA CD A8 UTF-8 C1 AA CD A8 Unicode 6A 00 68 03 (将GBK值误认为UTF-8值的结果)
知乎上的回答,详细的可以参考下面链接地址。
作者:TwinsForChina
链接:https://www.zhihu.com/question/25367290/answer/138972490
来源:知乎
看一下你的这个java文件是什么编码。如果是utf-8的话。汉子占3个字节就是32位
对于txt格式的文本文件
你把那个拷贝的文件(乱码的) :文件-->另存为
在弹出界面的保存左面有一个编码选择项,
选择你原来的编码格式,保存后打开就OK.
println()写成print(),多了ln表示打印换行,没有ln就不换行了
大哥 你遍历都是同一个 也就是第一个 for(byte b3:bytes){} for(byte b2:bytes){} for(byte b:bytes){}
我搜了一下,UTF-8编码的中文字节数有争议,因为UTF-8是可变长编码。
哪个地方?
请问,诚心请问,为何转为二进制后,两个中文字符的每个字节有32位??
编码方式不同
一般都是用utf-8
这是相应的编码表中的字符的对应值,比如ASCII中A字符就对应65,这些并不重要,并不要去记~
java中0x开头表示的是该数为十六进制,如int i=0xf;//以0x开头表示十六进制的写法
以0开头的表示该数是八进制,如 int n=010;//以0开头表示八进制
0xff中的f指的是十六进制中的f,f转换为十进制是15,f转换为二进制是1111(前头可以根据位数的不同来补0)
0xff中的ff指的是十六进制中的ff,ff转换为十进制就是255,ff转换为二进制就是1111 1111(前头可以根据位数的不同来补0)