当我尝试以下操作时,出现错误:

unsigned char * data = "00000000"; //error: cannot convert const char to unsigned char

有没有一种特殊的方法可以做到这一点,我错过了?

更新

为了简洁起见,我将解释我想要实现的目标:

我想在C ++中创建一个StringBuffer,它使用原始二进制数据的无符号值。 似乎无符号字符是实现此目的的最佳方法。 如果有更好的方法?

===============>>#1 票数:2

是的,这样做:

const char *data = "00000000";

字符串文字是char数组,而不是unsigned char

如果你需要将它传递给一个带有const unsigned char *的函数,那么你需要将它转换为:

foo(static_cast<const unsigned char *>(data));

===============>>#2 票数:2

unsigned char data[] = "00000000";

这会将"00000000" 复制unsigned char[]缓冲区,这也意味着缓冲区不会像字符串文字那样是只读的。

您执行此操作的方式不起作用的原因是因为您 data 指向 (带signed )字符串文字( char[] ),因此数据必须是char*类型。 如果没有显式地转换"00000000" ,则不能这样做,例如:( (unsigned char*)"00000000"

请注意,字符串文字不是显式的const char[]类型,但是如果你不这样处理它们并尝试修改它们,你导致未定义的行为 - 很多时候是访问冲突错误。

===============>>#3 票数: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 intlong long 这是因为当您对二进制文字(这是一个数组)执行操作时,您的操作会减少4或8,这是一个速度提升。

其次,如果您希望您的类表示二进制值,请不要使用字符串初始化它,而是使用单个值。 在你的情况下将是:

unsigned char data[] = {0x30, 0x30, 0x30, 0x30, /* etc */}

请注意 ,我假设您将二进制存储为二进制! 也就是说,在unsigned char中得到8位。 另一方面,如果你将二进制表示为0和1的字符串,这不是一个好主意,但不管怎样,你真的不需要unsigned char ,只需char就足够了。

===============>>#4 票数: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";

===============>>#5 票数:1

您正在尝试将字符串值分配给指向unsigned char的指针。 你不能这样做。 如果您有指针,则只能为其分配内存地址或NULL。

请改用const char。

===============>>#6 票数:1

目标变量是指向unsigned char的指针。 “00000000”是一个字符串文字。 它的类型是const char[9] 这里有两种类型不匹配。 一个是unsigned charchar是不同的类型。 缺少const限定符也是一个大问题。

你可以这样做:

unsigned char * data = (unsigned char *)"00000000";

但这是你不应该做的事情。 永远。 抛弃字符串文字的常量会让你有一天陷入困境。

以下是一个更好的,但严格来说它仍然是未指定的行为(可能是未定义的行为;我不想追逐它在标准中):

const unsigned char * data = (const unsigned char *)"00000000";

这里保留constness,但是你将指针类型从char*更改为unsigned char*

===============>>#7 票数:0

@Holland -

unsigned char * data = "00000000"; 

一个非常重要的一点,我不确定我们是否明确:字符串“00000000 \\ 0”(9个字节,包括分隔符)可能在READ-ONLY MEMORY中(取决于您的平台)。

换句话说,如果您以这种方式定义了变量(“数据”),并将其传递给可能尝试更改“数据”的函数...那么您可能会获得一个访问违规。

解决方案是:

1)声明为“const char *”(正如其他人已经说过的那样)

  ... and ...

2)将其作为“const char *”处理(不要修改其内容,或将其传递给可能修改其内容的函数)。

  ask by zeboidlund translate from so

未解决问题?本站智能推荐: