虽然天天写程序,牵涉到最基本的整型转字节数组竟然,完全没有头绪了。
所幸有万能的网络帮忙回忆。
要进行转换首先要回忆起这几个概念。
1.不管数字以什么进制表现在我的眼前,在计算机里都是以二进制传输和存储的。
2.byte就是8个bit,byte[]就是很多个连续的byte
那么怎么把一个int放到byte里呢?
很明显把int放到byte里相当于把一根参天大树的树干平均截断了,一个一个放在不同的车厢里。
那么现在就是要找到截断的方法了。
首先,再次清理一下思绪,不管数据是以什么形式出现在眼前,在计算机里都是以二进制形式存在的。
幻想大树的树干被分解成了一个小块一个小块的木头(bit),
每八个木头组成一个byte,就可以放进车厢拉走了。
怎么取得这8个木头呢?
肯定是和bit的操作有关。
于是想到了bit的按位与,按位或,按位异或。
1.按位与的特点:两个同时为1 才返回1.1&1=1,只有这一种情况返回1
2.按位或的特点:两个有一个为1就返回1,只有0&0时才返回0.
3.按位异或的特点:相同为0,相异为1.
在了解这三个操作的基础上,我们要知道我们要得到的是一部分原值,只不过这个值是某部分。
先用与运算试一下,
因为数据的保存都是从低位到高位的,所以要先移位把需要的数据移位到最低的N位,然后把这些数据切出来即可。
刚好,与操作满足这个需求。
于是
void intToBytes(int value, byte (*pbs)[4], int size)
{
// 低位在前
for (int i = 0; i < size; ++i)
{
byte a = (byte)((value >> (/*24- */(i * 8))) & 0xff);
(*pbs)[i] = a;
}
}
同样如果我们要把byte[]组合成int也要遵循同样的处理规律,即低位在前,
把byte[]数组按照拆分时的顺序反向移位,相加就能得到对应的int值了。
int bytesToInt(byte bytes[], int size)
{
int value = 0;
for (int i = 0; i < size; ++i)
{
value |= (bytes[i] << (i * 8));
}
return value;
}
PS:以上为小端字节序,如果改为大端字节序,你知道怎么处理吗?