我有一个函数,它需要一个8字节长的unsigned char。
void f1(unsigned char *octets)
{
unsigned char i;
for (i=0;i<8;i++)
printf("(%d)",octets[i]);
}
这是我使用它的方式,当我有一个64位整数时:
unsigned long long ull = 1;
f1((unsigned char *) &ull);
(它使用机器的原生字节序。)
我的问题是,如果没有1x64bit整数,我有2x32bit整数 - 有没有办法将它们有效地组合起来作为这个特定函数的输入?
unsigned long int low = 1;
unsigned long int high = 0;
答案 0 :(得分:3)
你可以把它们放在一个数组中:
unsigned long int lohi[2] = {1, 0};
f1((unsigned char *) lohi);
编辑:使用现有变量:
unsigned long int lohi[2] = {lo, hi};
答案 1 :(得分:3)
工会是否可以移植?如果是这样,这是一个很好的方法......
union {
struct {
unsigned char CharArray[8];
} ub;
struct {
unsigned long int IntArray[2];
} ul;
unsigned long long ull;
} Foo;
答案 2 :(得分:2)
Typecast,bitshift并按位或。
unsigned long int low = 1;
unsigned long int high = 0;
unsigned long long ull = (unsigned long long) high << 32 | low;
答案 3 :(得分:0)
您可以使用union和struct的组合来保留您的namings而不使用数组。
union {
struct {
unsigned long int low = 0;
unsigned long int high = 1;
};
unsigned long long int ull;
};
像往常一样使用low
和high
,并在致电ull
时使用f1
。但请注意,以这种方式编写它,你会假设一个小端序。
另请注意,在Linux和其他UNIX上,在64位模式下,long int
和long long int
都是64位(只有int
是32位)。 据我所知,只有Windows在64位模式下有long int
为32位。
答案 4 :(得分:0)
看待它的不同方式:
void f1( unsigned char* octet )
{
f2( octet, octet + 4 );
}
void f2( unsigned char* quad1, unsigned char *quad2 )
{
unsigned char i;
for (i=0;i<4;i++)
printf("(%d)",quad1[i]);
for (i=0;i<4;i++)
printf("(%d)",quad2[i]);
}
当两个函数具有相同的名称时,在C ++中可以更好地工作。