在处理byte(unsigned char) 数组过程中,有时会遇到需要改变数组某一位的问题,或者需要读取数组中某一位的值,这种处理在实现安全算法中比较常见,如DES和AES,所以在这里将两个实用的小函数分享一下。
1. 将byte数组dataddr的位于pos位置的数值改为b0:
首先将pos转换为在数组中的具体位置byte_count和bit_count,注意这里的pos是从1开始数的。然后用位运算将temp调整到目标位置,最后根据要修改的目标值b0,对dataddr目标位置值进行修改。
static void setbit(byte* dataddr,int pos,int b0){
byte byte_count;byte bit_count;
byte temp;
temp = 1;
byte_count = (pos - 1) / 8;bit_count = 7 - ((pos - 1) % 8);
temp <<= bit_count;
if(b0)
dataddr[byte_count] |= temp;
else{
temp = ~temp;
dataddr[byte_count] &= temp;
}
}
2. 读取byte数组dataddr的位于pos位置的数值:
与setbit相似,先将pos转换为数组中的位置,然后对目标位运算的变量temp进行相应的位处理,最后利用&读取目标位置的值作为返回值。
static int getbit(byte* dataddr,int pos){
byte byte_count;
byte bit_count;
byte temp;
temp = 1;
byte_count = (pos - 1) / 8;
bit_count = 7 - ((pos - 1) % 8);
temp <<= bit_count;
if(dataddr[byte_count] & temp)
return 1;
else
return 0;
}