当我尝试以下操作时,出现错误:
unsigned char * data = "00000000"; //error: cannot convert const char to unsigned char
有没有一种特殊的方法可以做到这一点我错过了?
更新
为了简洁起见,我将解释我想要实现的目标:
我想在C ++中创建一个StringBuffer,它使用原始二进制数据的无符号值。似乎无符号字符是实现此目的的最佳方法。如果有更好的方法?
答案 0 :(得分:2)
是的,这样做:
const char *data = "00000000";
字符串文字是char
的数组,而不是unsigned char
。
如果您需要将此传递给一个需要const unsigned char *
的函数,那么您需要将其转换为:
foo(static_cast<const unsigned char *>(data));
答案 1 :(得分:2)
unsigned char data[] = "00000000";
这将复制 "00000000"
到unsigned char[]
缓冲区,这也意味着缓冲区不会像字符串文字那样是只读的。
您执行该操作的方式之所以不起作用,是因为您的指向 data
到(signed
)字符串文字(char[]
),因此数据必须是char*
类型。如果不明确投射"00000000"
,则无法执行此操作,例如:(unsigned char*)"00000000"
。
请注意,字符串文字未显式为 const
char[]
类型,但是如果您不这样处理它们并尝试修改它们,那么 > 会导致未定义的行为 - 很多时候都是访问冲突错误。
答案 2 :(得分:2)
你有很多方法。一个是写:
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
,而不是long long
。这是因为当你对二进制文字(这是一个数组)执行操作时,你的操作会减少4或8,这是一个速度提升。
其次,如果您希望您的类表示二进制值,请不要使用字符串初始化它,而是使用单个值。在你的情况下将是:
unsigned char data[] = {0x30, 0x30, 0x30, 0x30, /* etc */}
注意我假设您将二进制存储为二进制!也就是说,在unsigned char中得到8位。另一方面,如果你将二进制表示为0和1的字符串,这不是一个好主意,但不管怎样,你真的不需要unsigned char
只有char
就足够了
答案 3 :(得分:2)
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";
答案 4 :(得分:1)
您正在尝试将字符串值分配给指向unsigned char的指针。你不能这样做。如果你有指针,你可以只分配内存地址或NULL。
改为使用const char。
答案 5 :(得分:1)
您的目标变量是指向unsigned char
的指针。 “00000000”是一个字符串文字。它的类型是const char[9]
。这里有两种类型不匹配。一个是unsigned char
和char
是不同的类型。缺少const
限定符也是一个大问题。
你可以这样做:
unsigned char * data = (unsigned char *)"00000000";
但这是你不应该做的事情。永远。抛弃字符串文字的常量会让你有一天陷入困境。
以下情况稍好一些,但严格来说,它仍然是未指明的行为(可能是未定义的行为;我不想追逐它在标准中的位置):
const unsigned char * data = (const unsigned char *)"00000000";
这里保留了常量,但是您正在将指针类型从char*
更改为unsigned char*
。
答案 6 :(得分:0)
@Holland -
unsigned char * data = "00000000";
一个非常重要的一点我不确定我们是否明确:字符串“00000000 \ 0”(9个字节,包括分隔符)可能在READ-ONLY MEMORY中(取决于您的平台)。
换句话说,如果您以这种方式定义变量(“data”),并将其传递给可能尝试更改“数据”的函数...那么您可能会获得一个访问违规。
解决方案是:
1)声明为“const char *”(正如其他人已经说过的那样)
... and ...
2)将其作为“const char *”处理(不要修改其内容,或将其传递给可能修改其内容的函数)。