2

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

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

有没有一种我想念的特殊方法来做到这一点?

更新

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

我想在 C++ 中创建一个 StringBuffer,它对原始二进制数据使用无符号值。似乎 unsigned char 是完成此任务的最佳方法。如果有更好的方法?

4

7 回答 7

2

是的,这样做:

const char *data = "00000000";

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

如果你需要将它传递给一个接受 的函数const unsigned char *,那么你需要强制转换它:

foo(static_cast<const unsigned char *>(data));
于 2011-12-11T21:38:39.843 回答
2
unsigned char data[] = "00000000";

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

你这样做的方式不起作用的原因是因为你指向 data一个 ( signed) 字符串文字 ( char[]),所以 data 必须是 type char*。如果不显式强制转换,您将无法做到这一点"00000000",例如:(unsigned char*)"00000000".

请注意,字符串文字不是明确的 type ,但是如果您不这样对待它们并尝试修改它们,您导致未定义的行为 - 很多时候是访问冲突错误。constchar[]

于 2011-12-11T21:42:16.023 回答
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 intor long long。这是因为当您对二进制文字(这是一个数组)执行操作时,您的操作会减少 4 或 8,这是一个速度提升。

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

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

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

于 2011-12-11T21:44:58.433 回答
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";
于 2011-12-11T21:52:28.877 回答
1

您正在尝试将字符串值分配给指向无符号字符的指针。你不能这样做。如果你有指针,你可以只分配内存地址或 NULL 给它。

改用 const char 。

于 2011-12-11T21:39:32.313 回答
1

您的目标变量是指向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*

于 2011-12-11T21:52:42.633 回答
0

@荷兰 -

unsigned char * data = "00000000"; 

很重要的一点我不确定我们是否清楚:字符串“00000000\0”(9 个字节,包括分隔符)可能位于只读存储器中(取决于您的平台)。

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

解决方案是:

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

  ... and ...

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

于 2011-12-11T21:47:54.490 回答