Visual c++ 将char buf[]传递给函数参数unsigned char*值

Visual c++ 将char buf[]传递给函数参数unsigned char*值,visual-c++,Visual C++,我有以下职能: string f1 (unsigned char * value, int len) { ... } 我想传递给它一个变量 char buf[4096]; 最好的方法是什么?令人惊讶的是f1((unsigned char*)buf,len)会起作用。能否将缓冲区的声明更改为预期的类型?如果是这样,我建议: const unsigned int BUFFER_SIZE = 4096; unsigned char buf[BUFFER_SIZE]; string result =

我有以下职能:

string f1 (unsigned char * value, int len)
{
...
}
我想传递给它一个变量

char buf[4096];

最好的方法是什么?

令人惊讶的是
f1((unsigned char*)buf,len)会起作用。

能否将缓冲区的声明更改为预期的类型?如果是这样,我建议:

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]));
string result=f1(重新解释cast(buf)、sizeof(buf)/sizeof(buf[0]);

我猜
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字符的数组”可以隐式转换为“指向字符的指针”: 如果没有
/J
编译选项,Visual C++的
char
是->
带符号的char
。 对于两种类型的A和B,C++仅在B是A的基类时才执行从“指针到A”到“指针到B”的转换(4.10的子句)。 由于
无符号字符
有符号字符
的情况并非如此,因此转换不是隐式的(不是在标准转换序列中,§4 conv)

但是,您可以使用
重新解释\u cast
显式强制转换它:

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


背景/标准 我一直有点(或更)好奇的是,
reinterpret\u cast
实际上做了什么,所以这里剩下的是关于标准对它的详细说明。 实际上,
重新解释强制转换
解析为(§5.2.10/7 expr.reinterpret.cast):

unsigned char*pu=static_cast(static_cast(as));
让我们详细讨论一下

内部
静态\u铸造(as)
static_cast
允许进行“数组到指针”转换(§5.2.9/8 expr.static.cast)和标准转换序列(§5.2.9/4,比较§4/3 conv)。 标准转换序列允许从“指向a的指针”转换为“指向无效的指针”。它保证指向操作数内存位置的起点。这很好,因为数组由一组连续分配的元素组成(§8.3.4 dcl.数组)

外部
静态\u强制转换

这与标准转换相反,即“指向无符号字符的指针”到“指向无效的指针”(§5.2.9/7+13)。当我们通过“指向void的指针”将“指向有符号字符的指针”转换为“指向无符号字符的指针”时,没有定义结果是什么(未指定)。注
char
unsigned char
是不同的类型(§3.9.1/1 basic.basic)。但在任何正常的机器/实现上都应该可以,因为
有符号字符
无符号字符
具有相同的对象表示。

静态转换(buf)不起作用,必须在此处使用重新解释转换“执行此操作的最佳方法是什么?”如何定义“最佳方法”?对于演员阵容,有一个简短的版本(参见冰封->C风格),一个清晰的版本(
reinterpret\u cast
)以及更多。
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
unsigned char* pu = static_cast < unsigned char* > ( static_cast < void* > (as) );