从 std::string 转换为 const unsigned int。

问题描述 投票:-1回答:1

我的有效载荷被存储在一个 std::string xyz (保存二进制数据),我需要把它传递给一个函数,这个函数把它作为 const unsigned int*. 我如何从 std::stringconst unsigned int*?

我试过了 reinterpret_cast<const unsigned int*>(&xyz.front()) 但却无法使用!

函数原型如下。

void roll(void *pdst, const unsigned int *psrc);

pdst 将保存结果。

c++ casting type-conversion
1个回答
1
投票

不要使用 std::string 来存储二进制数据,那个类是专门为处理字符串而设计的。 感觉原来有的C代码是用一个 char 数组来存储字节序列,并将其转换为 std::string 对于C++来说,它是一个字符串。 在这种情况下,它不是作为字符串使用的,所以将它存储在 std::string.

从那里,翻译成一个 unsigned int首先,即使你使用更原始的类型,如 char *因为这将违反严格的别名规则,导致未定义的行为。 我们要做的是创建一个新的变量,然后在其中加入 memcpy 的数据到这个新变量中。

这里是C++14标准工作草案中描述兼容类型的部分(3.10 p10)。

如果一个程序试图通过以下类型以外的glvalue来访问一个对象的存储值,那么这个行为是未定义的。 54

- 对象的动态类型。

- 对象的动态类型的cv限定版本。

- 类似于对象动态类型的类型(如4.4中定义)。

- 对象动态类型对应的有符号或无符号类型。

- 对象动态类型的cv限定版本对应的有符号或无符号类型。

- 聚合体或联合体类型,在其元素或非静态数据成员中包括上述类型之一(包括递归的子聚合体或包含的联合体的元素或非静态数据成员)。

- 对象的动态类型的基类类型(可能是cv限定的)。

- 的char或unsigned char类型。

正如你所看到的,它明确地允许访问任何对象作为一个 charunsigned char但它并没有提供这样的准入许可。charunsigned char 和其他任何东西一样。


0
投票

问题是你如何将二进制数据存储为std字符串?如果你只是简单地使用构造函数,你可以通过xyz.data()获得二进制数据。

© www.soinside.com 2019 - 2024. All rights reserved.