将char buf []传递给函数参数unsigned char * value

时间:2012-11-06 16:09:38

标签: visual-c++

我有功能:

string f1 (unsigned char * value, int len)
{
...
}

我想传递给它的

变量
char buf[4096];

这样做的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

您可以将缓冲区的声明更改为预期的类型吗?如果是这样,我会建议:

const unsigned int BUFFER_SIZE = 4096;
unsigned char buf[BUFFER_SIZE];
string result = f1(buf, BUFFER_SIZE);

如果您无法控制该变量,可以

string result = f1(reinterpret_cast<unsigned char*>(buf), sizeof(buf)/sizeof(buf[0]));

答案 1 :(得分:1)

我猜len指的是缓冲区中元素的数量(最好在f1的文档中查找)。您可以通过以下方式获得:

sizeof(buf) // as `sizeof(char)==1`
// or
sizeof(buf)/sizeof(buf[0])  // more commonly used, works with all types

此处的作品为sizeof(char) == sizeof(unsigned char) == 1

另一点是你不能打电话

f1(buf, len);

即使buf“4096 char”的数组,也可以隐式转换为“指向char的指针”: 如果没有/J编译选项,Visual-C ++的charsigned by default - &gt; signed char。 对于两种类型A和B,只有当B是A的基类(§4.10conv.ptr)时,C ++才执行从“指针指向A”到“指向B指针”的转换。 由于unsigned charsigned char不是这种情况,因此转换不是隐含的(不是标准转换序列,§4转换)。

但是,您可以使用reinterpret_cast显式强制转换它:

signed char as[4096];
int const len = sizeof(as)/sizeof(as[0]);
unsigned char* pu = reinterpret_cast < unsigned char* > (as);
f1(pu, len);

这是传递数组的最佳方法吗? 有一个微妙之处:如果该函数明确专门用于unsigned char,它可能会“误解”传递的signed char缓冲区的内容。此外,如果f1更改了数组,那么解释signed char缓冲区的数据可能会与f1所做的相冲突(因为f1unsigned char数组上工作。 但是如果你知道f1做什么以及如何解释缓冲区,你可以做这个演员。

有什么意义?为什么不是隐含的或static_cast允许在这里? 在指向signedunsigned类型(具有相同的对象表示)的指针之间进行转换可能有一种特殊情况,但我没有找到。基本上,人们想避免像:

这样的演员
short s = 42;
long* pl = &s;
*pl = 4000; // possibly stack corruption

long l = 4200;
short* ps = &l;
*ps = 42;
//- value of l dependent e.g. on endianess



<强>背景/标准 我对reinterpret_cast实际上做了什么有点(或更多)好奇,所以其余部分详细介绍了标准所说的内容。 实际上,reinterpret_cast已解析为(§5.2.10/ 7 expr.reinterpret.cast):

unsigned char* pu = static_cast < unsigned char* > ( static_cast < void* > (as) );

让我们详细说明。

内部static_cast < void* > (as)static_cast允许进行“数组到指针”转换(§5.2.9/ 8 expr.static.cast)和标准转换序列(§5.2.9/ 4,比较§4/ 3转换) 。 标准转换序列允许从“指针转换为A”“指向void”的转换。它保证指向操作数的内存位置的开头。这很好,因为数组由一组连续分配的元素组成(§8.3.4dcl.array)。

static_cast < unsigned char* >: 这是标准转换的反转 - 即“指向unsigned char的指针”指向“指向void的指针”(§5.2.9/ 7 + 13)。它没有定义结果是什么(未指定),因为我们将“指针转换为signed char”通过“指向void”转换为“指向unsigned char的指针“。注意charunsigned char是不同的类型(§3.9.1/ 1 basic.fundamental)。但是对于任何理智的机器/实现都应该没问题,因为signed charunsigned char具有相同的对象表示。

答案 2 :(得分:0)

令人惊讶的是,f1((unsigned char*)buf, len);可以解决问题。