bit:二进制的表示方式或者单位,只有0和1
Byte:8bit表示1Byte,也是单字节,分正负数,以整数的形式显示,例如(Byte)0X0F,如果使用log输出,你会发现输出的是15。
这时候你会发现一个问题(byte)0X90,这个使用log输出的时候,会发现神奇的现象,输出的是-112,为什么呢,怎么成负数了,不要着急,咱们慢慢来讲。
前面说了一个Byte是8bit,并且分为正负,最高位是正负的符号,1代表负数,0代表整数,0X90 二进制位 1001 0000,大家看到了吗,首位是1,是负数,又出现问题了,就算是负数,也应该是-16也不应该是-112啊,这又涉及到计算机的编码方式了,计算机使用的是补码形式,具体的实现方式感兴趣的同学可以自己去查查。咱们继续,还得有一些信息需要补充一下
单字节:8位 1111 1111
Byte:8位,单字节 (有符号)
char:双字节
双字节:16位 short
四字节:32位 int
long:8字节
float:4字节
double:8字节
Byte是单字节,int是四字节的,这就在转换补码的时候出现问题了,位数是不一致的,这个怎么办呢,总不能按照错的计算吧,当然有办法 byte.toInt() and 0XFF,大家想想为什么要和0XFF与呢?
悄悄告诉你,主要是补位,8位变为32位,钱24位补0,这就成正数了,变为正常的数值了。
说多了,说说今天想实现的功能吧,Byte和bit的想换转换和如何输出Byte形式的字符串
Byte转bit
/** *Byte转Bit */
fun byteToBit(byte: Byte): String {
return "${(byte.toInt() and 0XFF shr 7 and 0X01).toByte()}" +
"${(byte.toInt() and 0XFF shr 6 and 0X01).toByte()}" +
"${(byte.toInt() and 0XFF shr 5 and 0X01).toByte()}" +
"${(byte.toInt() and 0XFF shr 4 and 0X01).toByte()}" +
"${(byte.toInt() and 0XFF shr 3 and 0X01).toByte()}" +
"${(byte.toInt() and 0XFF shr 2 and 0X01).toByte()}" +
"${(byte.toInt() and 0XFF shr 1 and 0X01).toByte()}" +
"${(byte.toInt() and 0XFF shr 0 and 0X01).toByte()}"
}
只能这样一个一个的去处理,然后组成bit字符串
bit转Byte
/** * Bit转Byte */
fun bitToByte(bit: String): Byte {
var len = 0
if (bit == null) {
return 0
}
len = bit.length
when (len) {
4 -> {
return Integer.parseInt(bit, 2).toByte()
}
8 -> {
if (bit.toCharArray()[0] == '0') {
//正数
return Integer.parseInt(bit, 2).toByte()
} else {
//负数
return (Integer.parseInt(bit, 2) - 256).toByte()
}
}
else -> return 0
}
}
Byte转字符串
/**
* Byte转字符串
*/
val HEXES = "0123456789ABCDEF"
val HEX_INDICATOR = "0X"
fun byteToString(byte: Byte): String {
var hex = StringBuilder(2)
hex.append(HEX_INDICATOR)
hex.append(HEXES.toCharArray()[byte.toInt() and 0XFF and 0XF0 shr 4] )
hex.append(HEXES.toCharArray()[byte.toInt() and 0XFF and 0X0F] )
return hex.toString()
}