前言:
最近遇到个问题,APP这边socket上发上去的是字节流,接收到的也是字节流,我需要根据其中的字节拿到该字节的8为比特,并转化为有用的数据。
基础知识点:
bit:位
一个二进制数据0或1,是1bit;byte:字节
存储空间的基本计量单位,如:MySQL中定义 VARCHAR(45) 即是指 45个字节;
1 byte = 8 bit一个英文字符占一个字节;
1 字母 = 1 byte = 8 bit一个汉字占2个字节;
1 汉字 = 2 byte = 16 bit
byte:一个字节(8位)(-128~127)(-2的7次方到2的7次方-1)
short:两个字节(16位)(-32768~32767)(-2的15次方到2的15次方-1)
int:四个字节(32位)(一个字长)(-2147483648~2147483647)(-2的31次方到2的31次方-1)
long:八个字节(64位)(-9223372036854774808~9223372036854774807)(-2的63次方到2的63次方-1)
float:四个字节(32位)(3.402823e+38 ~ 1.401298e-45)(e+38是乘以10的38次方,e-45是乘以10的负45次方)
double:八个字节(64位)(1.797693e+308~ 4.9000000e-324&
按位与运算符 ,|
按位或运算符 ,>>
右移运算符 ,<<
左移运算符。(具体有空再补充)
byte转bit
Byte b = cmds[0x21];
Byte array[8] = {0};
for (int i = 7; i >= 0; i--) {
array[i] = (Byte)(b & 1);
b = (Byte) (b >> 1);
}//array 为8位bit的数组
DLog(@"0 = %hhu, 1 = %hhu",array[0],array[1]);
bit转byte
- (Byte)decodeBinaryString:(NSString *)byteStr{ // 传入例子@“01001000”
unsigned long result;
if (!byteStr.length) {
return 0;
}
NSInteger length = byteStr.length;
if (length != 4 && length != 8) {
return 0;
}
if (length == 8)
{
if ([byteStr characterAtIndex:0] == '0') { // 正数
result = strtoul([byteStr UTF8String], 0, 2);
}else{ // 负数
result = strtoul([byteStr UTF8String], 0, 2) - 256;
}
}
else
{
result = strtoul([byteStr UTF8String], 0, 2); // 2进制转为10进制
}
DLog(@"result = %hhu",(Byte)result);
return (Byte)result;
}
先这样有空再来补充其他的。