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) );