编辑存储在字节数组中的数据 我一直在忙于将经常被操作的数据存储到一大堆未签名的字符中(因为C++没有字节类型)。因此,如果我将浮点存储到char数组中,它将占用4个无符号字符。很简单,除非现在我想在数据在数组中时编辑它,我需要同时访问所有4个元素,就我所知这是不可能的。 那么,有没有一种方法可以在不使用memcpy()的情况下将4个无符号字符编辑成我想要的浮点值

编辑存储在字节数组中的数据 我一直在忙于将经常被操作的数据存储到一大堆未签名的字符中(因为C++没有字节类型)。因此,如果我将浮点存储到char数组中,它将占用4个无符号字符。很简单,除非现在我想在数据在数组中时编辑它,我需要同时访问所有4个元素,就我所知这是不可能的。 那么,有没有一种方法可以在不使用memcpy()的情况下将4个无符号字符编辑成我想要的浮点值,c++,arrays,byte,C++,Arrays,Byte,例如: #include <iostream> #include <string.h> #include <stdint.h> using namespace std; struct testEntity { float density; uint16_t xLoc, yLoc; uint16_t xVel, yVel; uint16_t xForce, yForce; uint16_t mass; uin

例如:

#include <iostream>
#include <string.h>
#include <stdint.h>

using namespace std;

struct testEntity {

    float density;
    uint16_t xLoc, yLoc;
    uint16_t xVel, yVel;
    uint16_t xForce, yForce;
    uint16_t mass;
    uint8_t UId;
    uint8_t damage; 
    uint8_t damageMultiplier;
    uint8_t health;
    uint8_t damageTaken;
};


int main()
{

    testEntity goblin { 1.0, 4, 5, 5, 0, 0, 0, 10, 1, 2, 1, 10, 0 };
    testEntity goblin2;
    unsigned char datastream[24];
    unsigned char* dataPointer = datastream;

    memcpy(&datastream, &goblin, sizeof(testEntity));


    //I know that datastream[0..3] contains information on goblin.density
    //How would I edit goblin.density without memcpy into another testEntity structure?

    memcpy(&goblin2, &datastream, sizeof(testEntity));

return 0;
}
#包括
#包括
#包括
使用名称空间std;
结构测试性{
漂浮密度;
uint16_t xLoc,yLoc;
uint16_t xVel,yVel;
uint16_t xForce,yForce;
uint16_t质量;
uint8_t UId;
uint8_t损坏;
uint8_t损坏多路复用器;
uint8_t健康;
uint8_t损坏;
};
int main()
{
测试地精{1.0,4,5,5,0,0,0,10,1,2,1,10,0};
测试妖精2;
无符号字符数据流[24];
无符号字符*数据指针=数据流;
memcpy(&datastream,&goblin,sizeof(testEntity));
//我知道datastream[0..3]包含关于goblin.density的信息
//如果没有memcpy,我如何将goblin.density编辑到另一个testEntity结构中?
memcpy(&goblin2,&datastream,sizeof(testEntity));
返回0;
}
以下是我所做的:

#include <iostream>
#include <string.h>
#include <stdint.h>

using namespace std;

struct testEntity {

    float density;
    uint16_t xLoc, yLoc;
    uint16_t xVel, yVel;
    uint16_t xForce, yForce;
    uint16_t mass;
    uint8_t UId;
    uint8_t damage; 
    uint8_t damageMultiplier;
    uint8_t health;
    uint8_t damageTaken;
};


int main()
{

    testEntity goblin = { 1.0, 4, 5, 5, 0, 0, 0, 10, 1, 2, 1, 10, 0 };
    testEntity goblin2;
    unsigned char datastream[24];
    unsigned char* dataPointer = datastream;
    testEntity *goblinP;

    memcpy(datastream, &goblin, sizeof(testEntity));


    goblinP = (testEntity *) datastream;

    cout << goblinP->density << endl;

return 0;
}
#包括
#包括
#包括
使用名称空间std;
结构测试性{
漂浮密度;
uint16_t xLoc,yLoc;
uint16_t xVel,yVel;
uint16_t xForce,yForce;
uint16_t质量;
uint8_t UId;
uint8_t损坏;
uint8_t损坏多路复用器;
uint8_t健康;
uint8_t损坏;
};
int main()
{
测试地精={1.0,4,5,5,0,0,0,10,1,2,1,10,0};
测试妖精2;
无符号字符数据流[24];
无符号字符*数据指针=数据流;
测试性*goblinP;
memcpy(数据流和goblin,sizeof(testEntity));
goblinP=(testEntity*)数据流;

cout density通过使用union,您可以以各种方式访问内存位置,也许这就是您要寻找的(如果我理解正确的话):

编辑:

最好为您的结构创建一个序列化/反序列化函数,以便将其从/转换为结构

e、 g

ostream&operator您的以下计划:

goblinP = (testEntity *)datastream;
违反了严格的别名规则。据解释,该规则是只能通过具有该对象类型的表达式访问该对象;只有少数例外。您可以作为未签名字符访问该对象,但不能作为对象访问未签名字符

这段代码似乎可以工作,但您实际上是在玩火,因为编译器可能会决定优化您读取对象的尝试,因为标准规定您实际上是在读取未初始化的变量

要执行所需操作,请声明缓冲行:

testEntity goblin;
然后您可以通过执行以下操作将其别名为字节:

unsigned char *datastream = reinterpret_cast<unsigned char *>(&goblin);
unsigned char*datastream=reinterpret\u cast(&goblin);

您可以通过
datastream
写入字节,然后访问
goblin
,查看您得到了什么。(当然,这仍然取决于您写入的字节实际上是
测试实体的有效对象表示形式
).

如果我理解正确,您可以将
datastream
转换为
testEntity*
,然后访问浮点值。@重复数据消除程序我知道这一点。我从未说过我没有,也没有试图混淆两者。回答我的问题,如果您认为我需要澄清,请给出,或者不回答。@user2233706我会尝试一下@重复数据消除器它有24个字节长。请注意,在
density
之后,在同一行上有两个
uint16\u t
。现在,如果我将数据流的大小增加一倍,现在是48个字节,我将如何向其中插入第二个测试实体?我在考虑memcpy(数据流+大小of(testEntity)和goblin2,大小of(testEntity)),然后是goblinP=(testEntity*)数据流[24],但这似乎失败了。有什么想法吗?你需要做
goblinP=(testEntity*)(dataStream+24)
goblinP=(testEntity*)和dataStream[24]
。您的表达式将
数据流的第一个字节强制转换为无效地址。为什么不
goblinP=1+(testEntity*)数据流
?无论如何,避免使用幻数。@重复数据消除程序或
goblinP[1]
执行
goblinP=(testEntity*)后datastream
您可以通过编写
无符号字符datastream[sizeof goblin];
..
memcpy(datastream,&goblin,sizeof goblin);
我相信这是朝着正确方向迈出的一步。我完全忘记了联合!实际上,datastream(在您的示例中是goblin)将能够穿透数百个实体。例如,unsigned char datastream[48]可以容纳2个union实例。我可以将myunion.datastream存储到正确的位置,但是如何在某个时间间隔*24将goblinP数据重新解释到unions数据流中?仅myunion.datastream=&goblinP[24/48/72…n*24]在C++中,它访问了一个不是最后一个被分配的联盟成员。“丹尼尔马丁我错过了C++标签,我认为C++中最好是不同的方式,例如为你的结构创建一个重载,然后用它写/读,因为我想这就是你最终想要实现的,不是吗?”目标是拥有一块连续的内存,不同的实体将存在其中,并有一个单独的数组跟踪每个实体的开始和结束位置。@DanielMartin在不确切了解您的需求/约束的情况下,似乎使用一些STL容器比摆弄太多字节要好。结构向量确保y在内存中是连续的
testEntity goblin;
unsigned char *datastream = reinterpret_cast<unsigned char *>(&goblin);