为二进制数据创建字符串缓冲区的最佳方法
Best way to create a string buffer for binary data
当我尝试以下内容时,出现错误:
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 int
或long 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 char
和char
是不同的类型。缺少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 *"(不要修改其内容,或将其传递给可能修改其内容的函数(。
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?