位运算中的类型转换使我在C中感到困惑

位运算中的类型转换使我在C中感到困惑,c,char,int,bit-manipulation,unsigned,C,Char,Int,Bit Manipulation,Unsigned,我想做加密的一部分。我正试图用我得到的密钥流对数据进行加密 数据的格式为uint8\u t,密钥流KS的格式为uint32\u t 变量n是数据的长度(以32位块为单位) 我有以下代码: for (i=0; i<n; i++) { wo_data[4*i+0] ^= (uint8_t)(KS[i] >> 24) & 0xff; wo_data[4*i+1] ^= (uint8_t)(KS[i] >> 16) & 0xff; wo_data

我想做加密的一部分。我正试图用我得到的密钥流对数据进行加密

数据的格式为uint8\u t,密钥流KS的格式为uint32\u t

变量n是数据的长度(以32位块为单位)

我有以下代码:

for (i=0; i<n; i++)
{
  wo_data[4*i+0] ^= (uint8_t)(KS[i] >> 24) & 0xff;
  wo_data[4*i+1] ^= (uint8_t)(KS[i] >> 16) & 0xff;
  wo_data[4*i+2] ^= (uint8_t)(KS[i] >>  8) & 0xff;
  wo_data[4*i+3] ^= (uint8_t)(KS[i]      ) & 0xff;
}
KS由以下内容初始化:

7EC61272 743BF161 4726446A 6C38CED1
66F6CA76 EB543004 4286346C EF130F92
F22DB45B 37E71C5B 4EB6F404 CD886C15
9DCA27B1 F062AF46 F8E2F587 8976E8B8
我(显然)期待着以下几点:


正如@Arkku在评论中指出的,这是一个持久性问题

例如,如果您在little endian机器中,K[0]=0xF22DB45B将按以下方式存储:

@K+0: 5B
@K+1: B4
@K+2: 2D
@K+3: F2
因此,每个KS字的最低有效字节(LSB)必须与
wo_数据[4*i+0]
进行异或,以此类推

此代码给出了预期值:

for (int i=0; i < N; i++)
{
    wo_data[4*i+0] ^= ((KS[i]      ) & 0xff);
    wo_data[4*i+1] ^= ((KS[i] >>  8) & 0xff);
    wo_data[4*i+2] ^= ((KS[i] >> 16) & 0xff);
    wo_data[4*i+3] ^= ((KS[i] >> 24) & 0xff);
}
for(int i=0;i>8)和0xff);
wo_数据[4*i+2]^=((KS[i]>>16)和0xff);
wo_数据[4*i+3]^=((KS[i]>>24)和0xff);
}

32位版本可能更快,因为它处理每条指令更多的字节。此外,它可以以更有效的方式进行矢量化和执行。看。8位版本可以用来处理剩余的字节(如果有的话)。

“但它甚至不能达到预期的效果。”预期的结果是什么?相反会发生什么?通过编辑帖子,你应该弄清楚
KS
wo\u data
最初包含哪些数据,你得到了什么结果,以及你期望得到什么结果。“数据以uint8\t格式显示”。。。“数据初始化如下:7EC61272…”这有什么意义?您不能在
uint8\t
中存储32位数字。请显示一个。您确定尾数吗?而且,在施放到
uint8\u t
之后,
&0xff
看起来是多余的。效率实际上与矢量化无关。如果关闭所有向量操作,可以看到编译器为32位版本生成更高效的代码。这只是一个简单的结果,一次处理4个字节比一次处理1个字节要快。(我想这可能是最简单的意义上的“矢量化”,但这不是该术语在优化上下文中的通常含义。)正如您所说,标量32位版本比8位版本更有效(每个指令处理4字节,而不是1字节)。但矢量化32位版本可能比标量32位版本快(对于AVX,每条指令处理32字节而不是8字节)。
@K+0: 5B
@K+1: B4
@K+2: 2D
@K+3: F2
for (int i=0; i < N; i++)
{
    wo_data[4*i+0] ^= ((KS[i]      ) & 0xff);
    wo_data[4*i+1] ^= ((KS[i] >>  8) & 0xff);
    wo_data[4*i+2] ^= ((KS[i] >> 16) & 0xff);
    wo_data[4*i+3] ^= ((KS[i] >> 24) & 0xff);
}