理解这个与字节一起使用的代码是什么意思?

时间:2018-01-27 14:27:36

标签: c arrays

我试图了解以下C函数的作用是什么?

void foo(char v[4]) {
    int* p = (int*)v;
    *p = (*p & 0x000000FF) << 24 |  
         (*p & 0x0000FF00) << 8  | 
         (*p & 0x00FF0000) >> 8  | 
         (*p & 0xFF000000) >> 24;
}

假设sizeof(int)为4,可能的解决方案是四个。

  1. 计算数组v的所有字节的校验和&lt; - 不,我尝试在数组中放入单词“a,b,c,d”和“d,c,b,a”,结果是differentù
  2. 撤消数组v&lt; -The function
  3. 的内容
  4. 旋转数组v
  5. 的内容
  6. 代码错误&lt; - 代码的语法没有错误

2 个答案:

答案 0 :(得分:1)

通过执行int* p = (int*)v;,您现在可以访问v中的位,就像它们一样 整数的位。但在这种情况下,它用于访问32位 无需在所有掉期中从char转换为intchar

(*p & 0x000000FF)

返回前8位(最低有效位)[0 - 7]

(*p & 0x0000FF00)

返回接下来的8位[8 - 15]

(*p & 0x00FF0000)

返回接下来的8位[16 - 23]

(*p & 0xFF000000)

返回最后8位(最重要的)[24 - 31]

基本上这样做:v[0][v1]

<< x位左移,<< 24表示它移动所有位24 左边的空格。 |进行按位OR运算

(*p & 0x000000FF) << 24

将位[0-7]移动到[24 - 31]位置

(*p & 0x0000FF00) << 8

将位[8-15]移动到[16 - 23]位置

(*p & 0x00FF0000) >> 8

将位[16 - 23]移动到[8 - 15]位置

(*p & 0xFF000000) >> 24;

将[23 - 31]移动到[0 - 7]位置。

它正在反转v指向的字节顺序。

修改

正如其他人已经指出的那样,这种逆转只会起作用 char[4]的大小与int的大小相同的环境。 在那些不同的地方,代码变得不正确。

答案 1 :(得分:0)

它将char [4]解释为整数并将其交换:

(*p & 0x000000FF) << 24 == masks the lowes byte and puts it as highest byte
(*p & 0x0000FF00) << 8  == mask the 2nd lowest byte and puts it one higher  
(*p & 0x00FF0000) >> 8  == masks the 2nd highest byte and shifts it one down
(*p & 0xFF000000) >> 24 == masks the highes byte and moves it to the lowest
all or-ed together it swaps your char array around. 

['a','b','c','d']['d','c','b','a'].

它闻起来。不好。

使用char作为临时使用临时更换文件的元素&#34; 这是什么&#34;然后这个char-array到int指针的bithift转换更加节省 - 如果你在一个char为8位且int为64的系统上会发生什么?