作为我CS课程的一部分,我已经获得了一些使用的功能。其中一个函数接受一个指向无符号字符的指针,将一些数据写入文件(我必须使用这个函数,所以我不能只使用自己的目的构建函数,使用不同的BTW)。我需要编写一个整数数组,其值使用此函数可以达到4095(仅使用无符号字符)。
但是,我认为无符号字符的最大值为256,因为它长度为1个字节,我是正确的吗?因此,我需要为每个整数使用4个无符号字符?但是,对于整数,转换似乎不适用于较大的值。有没有人知道如何最好地将整数数组转换为无符号字符?
答案 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比普通整数更少。可能是真的。因此,您可以节省空间,而不是写出每个整数的顶部位。就个人而言,我认为不值得付出努力。写入值并处理传入数据的额外代码不值得您节省(可能如果数据是国会图书馆的大小)。规则一做尽可能少的工作(它更容易维护)。如果被问到,则规则二优化(但首先要问为什么)。您可以节省空间,但会花费处理时间和维护成本。