c++ - 读取内存的特定地址并将其解释为所需的类型
问题描述
假设我有一个数组float someArray[10]
,女巫我已经为其所有元素分配了值。我知道 someArray 分配了 40 个字节的内存,因为每个浮点数都有 4 个字节。
现在我想用two byte
bytwo byte
从头开始读取这 40 个字节的内存并将它们解释为 unit16_t 所以我将拥有unit16_t intArray[20]
. 我不想用union
。
我也阅读了这些问题,但没有帮助:
解决方案
这是非常棘手的,非常低级的东西。你绝对确定你不能以任何其他方式解决这个问题吗?你有考虑字节序吗?你是?你有?好的。
C++ 不允许您在内存中获取一个连续区域并将其解释为您想要的任何内容。几乎唯一允许您做的事情是将指向属于单个数组的连续内存块的开头的指针解释为 a char*
,unsigned char*
或者从 C++17 开始std::byte*
(参见严格的别名规则,第 [basic. lval] 在标准中,对于 C++17,它是 § 6.10 (8))。本质上,这意味着您可以将数组解释为字节序列。就是这样,但它足以复制内存。这就是您在不相关类型之间进行转换的方式。
使用 C 风格的数组(它们容易出错,所以尽可能避免):
#include <cstddef>
#include <cstdint>
#include <cstring>
int main()
{
constexpr std::size_t item_count = 10;
float float_array[item_count] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
std::uint16_t int_array[item_count * (sizeof(float) / sizeof(uint16_t))];
std::memcpy(
reinterpret_cast<char*>(int_array),
reinterpret_cast<char*>(float_array),
item_count * sizeof(float));
}
或与std::array
:
#include <array>
#include <cstddef>
#include <cstdint>
#include <cstring>
int main()
{
std::array<float, 10> float_array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
std::array<std::uint16_t, float_array.size() * (sizeof(float) / sizeof(uint16_t))> int_array;
std::memcpy(
reinterpret_cast<char*>(int_array.data()),
reinterpret_cast<char*>(float_array.data()),
float_array.size() * sizeof(float));
}
推荐阅读
- java - 如何在其他活动中使用最终变量?
- angular - 角度绑定无法正常工作
- python - 在 Windows 10 上的 python 进程中导入 tensorflow 需要 1.5GB 的 RAM
- android - 如何将领域对象从后台线程传递给 UiThread?
- java - spring boot thymeleaf 多选数据绑定 mongodb
- react-native - react-native expo 问题:`SceneView` 的检查方法
- regex - 使用 sed 在特定文本之后删除文件名中的空格
- python - 单应性透视投影不起作用
- java - 如何将一个rdd拆分成多个rdd(横向),GC开销异常
- java - Java 集的并集或交集