当我尝试以下操作时,出现错误:
unsigned char * data = "00000000"; //error: cannot convert const char to unsigned char
有没有一种我想念的特殊方法来做到这一点?
更新
为简洁起见,我将解释我想要实现的目标:
我想在 C++ 中创建一个 StringBuffer,它对原始二进制数据使用无符号值。似乎 unsigned char 是完成此任务的最佳方法。如果有更好的方法?
当我尝试以下操作时,出现错误:
unsigned char * data = "00000000"; //error: cannot convert const char to unsigned char
有没有一种我想念的特殊方法来做到这一点?
更新
为简洁起见,我将解释我想要实现的目标:
我想在 C++ 中创建一个 StringBuffer,它对原始二进制数据使用无符号值。似乎 unsigned char 是完成此任务的最佳方法。如果有更好的方法?
是的,这样做:
const char *data = "00000000";
字符串文字是 的数组char
,而不是unsigned char
。
如果你需要将它传递给一个接受 的函数const unsigned char *
,那么你需要强制转换它:
foo(static_cast<const unsigned char *>(data));
unsigned char data[] = "00000000";
这将复制 "00000000"
到unsigned char[]
缓冲区中,这也意味着缓冲区不会像字符串文字那样是只读的。
你这样做的方式不起作用的原因是因为你指向 data
一个 ( signed
) 字符串文字 ( char[]
),所以 data 必须是 type char*
。如果不显式强制转换,您将无法做到这一点"00000000"
,例如:(unsigned char*)"00000000"
.
请注意,字符串文字不是明确的 type ,但是如果您不这样对待它们并尝试修改它们,您将导致未定义的行为 - 很多时候是访问冲突错误。const
char[]
你有很多方法。一种是写:
const unsigned char *data = (const unsigned char *)"00000000";
另一个更推荐的方法是按原样声明data
:
const char *data = "00000000";
当你将它传递给你的函数时:
myFunc((const unsigned char *)data);
注意,一般来说一串unsigned char
是不寻常的。无符号字符数组更常见,但您不会使用字符串 ("00000000") 对其进行初始化
如果你想要原始二进制数据,首先让我告诉你,你最好使用更大的容器来代替unsigned char
,例如long int
or long long
。这是因为当您对二进制文字(这是一个数组)执行操作时,您的操作会减少 4 或 8,这是一个速度提升。
其次,如果您希望您的类表示二进制值,请不要使用字符串初始化它,而是使用单独的值。你的情况是:
unsigned char data[] = {0x30, 0x30, 0x30, 0x30, /* etc */}
请注意,我假设您将二进制存储为二进制!也就是说,你在一个无符号字符中得到 8 位。另一方面,如果您将二进制表示为 0 和 1 的字符串,这并不是一个好主意,但无论哪种方式,您都不需要unsigned char
并且就char
足够了。
std::vector<unsigned char> data(8, '0');
或者,如果数据不统一:
auto & arr = "abcdefg";
std::vector<unsigned char> data(arr, arr + sizeof(arr) - 1);
或者,您可以直接从文字分配:
std::basic_string<unsigned char> data = (const unsigned char *)"abcdefg";
您正在尝试将字符串值分配给指向无符号字符的指针。你不能这样做。如果你有指针,你可以只分配内存地址或 NULL 给它。
改用 const char 。
您的目标变量是指向unsigned char
. “00000000”是一个字符串文字。它的类型是const char[9]
. 这里有两种类型不匹配。一个是那个,unsigned char
并且char
是不同的类型。缺少const
预选赛也是一个大问题。
你可以这样做:
unsigned char * data = (unsigned char *)"00000000";
但这是你不应该做的事情。曾经。放弃字符串文字的 constness 总有一天会给你带来大麻烦。
以下稍微好一点,但严格来说它仍然是未指定的行为(可能是未定义的行为;我不想追究它在标准中的含义):
const unsigned char * data = (const unsigned char *)"00000000";
在这里,您保留了 constness,但您将指针类型从 更改char*
为unsigned char*
。
@荷兰 -
unsigned char * data = "00000000";
很重要的一点我不确定我们是否清楚:字符串“00000000\0”(9 个字节,包括分隔符)可能位于只读存储器中(取决于您的平台)。
换句话说,如果您以这种方式定义变量(“数据”),并将其传递给可能尝试更改“数据”的函数......那么您可能会遇到访问违规。
解决方案是:
1)声明为“const char *”(正如其他人已经说过的)
... and ...
2)将其视为“const char *”(不要修改其内容,或将其传递给可能修改其内容的函数)。