如果整数大于256,如何在C中将整数转换为unsigned char?

时间:2011-01-07 20:20:17

标签: c casting unsigned integer chars

作为我CS课程的一部分,我已经获得了一些使用的功能。其中一个函数接受一个指向无符号字符的指针,将一些数据写入文件(我必须使用这个函数,所以我不能只使用自己的目的构建函数,使用不同的BTW)。我需要编写一个整数数组,其值使用此函数可以达到4095(仅使用无符号字符)。

但是,我认为无符号字符的最大值为256,因为它长度为1个字节,我是正确的吗?因此,我需要为每个整数使用4个无符号字符?但是,对于整数,转换似乎不适用于较大的值。有没有人知道如何最好地将整数数组转换为无符号字符?

7 个答案:

答案 0 :(得分:5)

通常一个unsigned char保存8位,最大值为255.如果你想知道你的特定编译器,请从<limits.h>打印掉CHAR_BIT和UCHAR_MAX你可以提取32位的单个字节整型,

#include <stdint.h>

void
pack32(uint32_t val,uint8_t *dest)
{
        dest[0] = (val & 0xff000000) >> 24;
        dest[1] = (val & 0x00ff0000) >> 16;
        dest[2] = (val & 0x0000ff00) >>  8;
        dest[3] = (val & 0x000000ff)      ;
}


uint32_t
unpack32(uint8_t *src)
{
        uint32_t val;

        val  = src[0] << 24;
        val |= src[1] << 16;
        val |= src[2] <<  8;
        val |= src[3]      ;

        return val;
}

答案 1 :(得分:2)

无符号字符值通常具有1字节的值,因此您可以将任何其他类型分解为无符号字符数组(例如,对于4字节的int,您可以使用4个无符号字符的数组)。你的运动可能与仿制药有关。您应该使用fwrite()函数将文件写为二进制文件,并在文件中逐字节写入。

以下示例应该为文件写入一个数字(任何数据类型)。我不确定它是否有效,因为你强制转换为unsigned char *而不是void *。

int homework(unsigned char *foo, size_t size)
{
    int i;

    // open file for binary writing
    FILE *f = fopen("work.txt", "wb");
    if(f == NULL)
        return 1;

    // should write byte by byte the data to the file
    fwrite(foo+i, sizeof(char), size, f);

    fclose(f);
    return 0;
}

我希望给出的例子至少可以给你一个起点。

答案 2 :(得分:0)

是的,你是对的;一个字符/字节只允许最多8个不同的位,所以这是2 ^ 8个不同的数字,它们是0到2 ^ 8 - 1,或者是0到255.做这样的事情来获取字节:

int x = 0;
char* p = (char*)&x;
for (int i = 0; i < sizeof(x); i++)
{
    //Do something with p[i]
}

(这不是正式的C,因为声明的顺序,但无论如何......它更具可读性。:))

请注意,此代码可能无法移植,因为它取决于处理器int的内部存储空间。

答案 3 :(得分:0)

听起来你真正想做的就是调用sprintf获取整数的字符串表示。这是从数字类型转换为字符串表示形式的标准方法。以下内容可能会让您入门:

char num[5]; // Room for 4095

// Array is the array of integers, and arrayLen is its length
for (i = 0; i < arrayLen; i++)
{
    sprintf (num, "%d", array[i]);

    // Call your function that expects a pointer to chars
    printfunc (num);
}

答案 4 :(得分:0)

分配:integers whose values can be up to 4095 using this function (that only takes unsigned chars的部分应该给你一个巨大的提示。 4095无符号是12位。

您可以将12位存储在16位short中,但这有点浪费空间 - 您只使用12位中的12位短路。由于您在转换字符时处理的字节数超过1个字节,因此您可能需要处理结果的endianess。最容易的。

如果你担心空间,你也可以做一些字段或一些打包的二进制结构。更多的工作。

答案 5 :(得分:0)

如果没有关于函数的信息,请参阅它的参数,返回值和语义(即其行为的定义),这很难回答。一种可能性是:

假设:

void theFunction(unsigned char* data, int size);

然后

int array[SIZE_OF_ARRAY];
theFunction((insigned char*)array, sizeof(array));

theFunction((insigned char*)array, SIZE_OF_ARRAY * sizeof(*array));

theFunction((insigned char*)array, SIZE_OF_ARRAY * sizeof(int));

所有这些都会将所有数据传递给theFunction(),但是否有任何意义将取决于theFunction()的作用。

答案 6 :(得分:0)

如果你必须编写一个整数数组,那么只需将数组转换为指向char的指针,然后运行数组。

int main()
{
    int    data[] = { 1, 2, 3, 4 ,5 };
    size_t size   = sizeof(data)/sizeof(data[0]); // Number of integers.

    unsigned char* out = (unsigned char*)data;
    for(size_t loop =0; loop < (size * sizeof(int)); ++loop)
    {
         MyProfSuperWrite(out + loop);  // Write 1 unsigned char
    }
}

现在人们已经提到过4096比普通整数更少。可能是真的。因此,您可以节省空间,而不是写出每个整数的顶部位。就个人而言,我认为值得付出努力。写入值并处理传入数据的额外代码不值得您节省(可能如果数据是国会图书馆的大小)。规则一做尽可能少的工作(它更容易维护)。如果被问到,则规则二优化(但首先要问为什么)。您可以节省空间,但会花费处理时间和维护成本。