我有功能:
string f1 (unsigned char * value, int len)
{
...
}
我想传递给它的
变量char buf[4096];
这样做的最佳方法是什么?
答案 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 ++的char
是signed by default - &gt; signed char
。
对于两种类型A和B,只有当B是A的基类(§4.10conv.ptr)时,C ++才执行从“指针指向A”到“指向B指针”的转换。
由于unsigned char
和signed 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
所做的相冲突(因为f1
在unsigned char
数组上工作。
但是如果你知道f1
做什么以及如何解释缓冲区,你可以做这个演员。
有什么意义?为什么不是隐含的或static_cast
允许在这里?
在指向signed
和unsigned
类型(具有相同的对象表示)的指针之间进行转换可能有一种特殊情况,但我没有找到。基本上,人们想避免像:
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的指针“。注意char
和unsigned char
是不同的类型(§3.9.1/ 1 basic.fundamental)。但是对于任何理智的机器/实现都应该没问题,因为signed char
和unsigned char
具有相同的对象表示。
答案 2 :(得分:0)
令人惊讶的是,f1((unsigned char*)buf, len);
可以解决问题。