1

可能重复:
将 int 转换为 4 字节 char 数组 (C)

使用动态 C 程序(语言是 C),我试图将 int 转换为 4 位长的字节数组。到目前为止,我在网上查了一些例子。但是,似乎没有一个对我有用。我遇到了一个持续的问题,即打印了正确的字节数,但由于某种原因它们重复了两次。我提供了以下代码:

void main(){
 int a=1379;
 int i=0;
 unsigned char value [4];

value[3] = (byte) (a & (0xFF));
value[2] = (byte) ((a >> 8) & 0xFF);
value[1] = (byte) ((a >> 16) & 0xFF);
value[0] = (byte) ((a >> 24) & 0xFF);
//convert int values to bytes by placing them in a char buffer

for(i=0;i<4;i++){
 printf("%d",value[i]);
 printf(", ");
 }
printf("\n");
}

例如,使用此值,程序会打印“5, 99, 5, 99”,而它应该打印“0, 0, 5, 99”。感谢您的帮助。

4

3 回答 3

4

几乎可以肯定的是,“动态 C”是一个int16 位的实现,这对于 C 来说是完全“合法的”。如果int是 16 位,则任何超过 16 位的移位都是模 16,因此后两个移位重复前两个。

于 2012-07-11T19:22:11.493 回答
1

您需要将 int 变量中的位复制到 char 数组中。您可以memcpy像这样简单地做到这一点:

#include <stdio.h>
#include <string.h>

void split(int val, unsigned char *arr) {
    memcpy(arr, &val, sizeof(int));
}

int main() {
    unsigned char bytes[4];
    split(1379, bytes);
    printf("%d, %d, %d, %d\n", bytes[0], bytes[1], bytes[2], bytes[3]);
}
于 2012-07-11T21:18:15.440 回答
0
#include <stdio.h>
#include <string.h>

int main(void){
 int a=1379;
 unsigned bot,top ;
 unsigned char value [sizeof a];

 memcpy (value, &a, sizeof value);

 /* You can omit this loop if you are on a big-endian machine */
#if LITTLE_ENDIAN
 for (bot =0, top = sizeof value; --top > bot; bot++) {
    unsigned char tmp;
    tmp = value[bot];
    value [bot] = value[top];
    value[top] = tmp;
    }
#endif

for(bot=0;bot < sizeof value;bot++){
 printf("%u", (unsigned int) value[bot]);
 printf(", ");
 }
printf("\n");
return 0;
}
于 2012-07-11T19:29:08.493 回答