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

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

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

1回复

C ++ - 分配一个unsigned char缓冲区,然后用字符串填充它

我是C++新手,所以如果这是一个天真的问题,请原谅我 - 但我仍然坚持寻找答案。 我正在尝试创建一个大小为1024的unsigned char数组,我使用以下代码完成: 现在我有一个std::string变量: 我想填充r_record与hw (即“世界你好”)开始在10'
3回复

用fstream方法读取二进制数据

我需要将二进制数据读取到缓冲区,但是在fstream中,我已经读取了将数据读取到char缓冲区的函数,所以我的问题是: 如何将二进制数据传输/广播到无符号char缓冲区中?在这种情况下,这是最佳解决方案吗? 例
3回复

memcpy不复制到缓冲区

我有一个带有std::vector<unsigned char> mPacket作为数据包缓冲区(用于发送UDP字符串)的类。 有一个对应的成员变量mPacketNumber ,用于跟踪到目前为止已发送了多少个数据包。 我在课堂上做的第一件事是保留空间: 然后,在我希
3回复

将char缓冲区转换为struct

我有一个char缓冲区buf包含buf[0] = 10 , buf[1] = 3 , buf[2] = 3 , buf[3] = 0 , buf[4] = 58 , 和一个结构: 我想将buf转换为Header 。 现在我正在使用该功能 我正在寻找解决方案,例如
2回复

写入文本文件,二进制vs ASCII

因此,我很难理解这个概念。 我有一个程序可以读取文本文件,然后将其写入另一个文件,并用无符号字符替换最常见的单词。 但是我一生无法理解的是如何确定两者之间的差异。 如果我将读取的原始字符或与1-255对应的无符号字符值写入新文件,那么当我反向返回原始文件内容时如何确定差异?
1回复

如何读取二进制数据并转换为unsigned char(C ++)

我有一个以二进制数据保存的原始图像文件(无编码)。 我想读取文件并将值转换为unsigned char。 但我不知道如何开始这样做。 每个文件包含640x480字节。 每个像素是8位。 我在这里使用了C ++帮助页面: http ://www.cplusplus.com/doc/t
1回复

在C ++中将十六进制字符串转换为字节

我正在寻找一个C ++库函数或内置函数,该函数可以读取长的十六进制字符串(例如SHA256哈希)并将其转换为无符号char数组。 我尝试为此使用stringstream但无济于事。 例如 -
1回复

将二进制文件读取到“ unsigned char”向量时,模板参数是什么

此代码有什么问题? 它给了我这个: 如果我将其更改为: 它抱怨:
2回复

将字符串中的每个字符转换为Hex c ++?

我试图将用户输入作为字符串,并将每个单独的元素转换为等效的十六进制形式,作为C ++中的无符号字符。 例如,我想接受用户输入“ CL”,并将其转换为存储在无符号字符中的0x43和0x4C。
1回复

如何使用setfill和setw在字符串变量中存储十六进制值

我读取了一个文件并将其转换为十六进制表示法,例如{0x4D,x0FF,0x01}其存储在无符号char数组中。 我可以打印要存储的内容,但无法存储阵列中的数据。 我阅读了位集类文档,但不确定是否需要它。 根据此源代码,我该如何库存读取的数据具有与以下相同的结果: 请注意,向量没有很