为二进制数据创建字符串缓冲区的最佳方法

时间:2011-12-11 21:37:47

标签: c++ compiler-errors rules unsigned-char

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

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

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

更新

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

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

7 个答案:

答案 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 charlong 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 charchar是不同的类型。缺少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 *”处理(不要修改其内容,或将其传递给可能修改其内容的函数)。