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

Best way to create a string buffer for binary data

本文关键字:最佳 方法 缓冲区 字符串 二进制 数据 创建      更新时间:2023-10-16

当我尝试以下内容时,出现错误:

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

有没有我缺少的特殊方法?

更新

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

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

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";

是的,这样做:

const char *data = "00000000";

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

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

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

你有很多方法。一种是写:

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 */}

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

unsigned char data[] = "00000000";

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

你这样做的方式不起作用的原因是因为你指向data(signed(字符串文字(char[](,所以数据必须是char*类型。如果不显式强制转换 "00000000",则无法执行此操作,例如:(unsigned char*)"00000000" .

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

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

请改用常量字符。

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

@Holland -

unsigned char * data = "00000000"; 

我不确定我们是否明确了非常重要的一点:字符串"00000000\0"(9 个字节,包括分隔符(可能位于只读内存中(取决于您的平台(。

换句话说,如果您以这种方式定义变量("数据"(,并将其传递给可能尝试更改"数据"的函数......然后,您可能会收到访问冲突。

解决方案是:

1(声明为"常量字符*"(正如其他人已经说过的那样(

  ... and ...

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