我试图将一个uint8_t数组转换为uint32_t数组,但似乎没有工作.
谁可以帮我这个事.我需要将uint8_t值设为uint32_t.
我可以通过转移来做到这一点,但我认为有一个简单的方法.
uint32_t *v4full;
v4full=( uint32_t *)v4;
while (*v4full) {
if (*v4full & 1)
printf("1");
else
printf("0");
*v4full >>= 1;
}
printf("\n");
Run Code Online (Sandbox Code Playgroud)
bvj*_*bvj 12
鉴于需要获取uint32_t的uint8_t值,以及in4_pton()的规格...
尝试使用可能的字节顺序更正:
uint32_t i32 = v4[0] | (v4[1] << 8) | (v4[2] << 16) | (v4[3] << 24);
Run Code Online (Sandbox Code Playgroud)
您的示例存在一个问题-实际上是您要尝试执行的操作(因为您不希望发生这种变化)。
瞧,这是一个鲜为人知的事实,但是不允许您以这种方式切换指针类型
具体来说,这样的代码是非法的:
type1 *vec1=...;
type2 *vec2=(type2*)vec1;
// do stuff with *vec2
Run Code Online (Sandbox Code Playgroud)
合法的唯一情况是if type2是char(或unsigned charor const char等),但是if type2是任何其他类型(uint32_t在您的示例中)则违反标准,并且如果您进行编译-O2或-O3优化,可能会在代码中引入错误。
这称为“严格别名规则”,它允许编译器假定不同类型的指针永远不会指向内存中的相关点-因此,如果更改一个指针的内存,则编译器不必重新加载所有其他指针指针。
除非您明确地指出,否则编译器很难找到违反该规则的实例。例如,如果您更改代码以执行此操作:
uint32_t v4full=*((uint32_t*)v4);
Run Code Online (Sandbox Code Playgroud)
并使用-O3 -Wall(我正在使用gcc)进行编译,您将得到警告:
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
Run Code Online (Sandbox Code Playgroud)
因此,您无法避免使用班次。
注:它将工作在较低的优化设置,它也将在更高的设置工作,如果你从来没有的信息指针改为通过v4和v4_full。它可以工作,但是仍然是一个错误,并且仍然“违反规则”。