gpt4 book ai didi

c++ - 解密无符号字符*

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:00 25 4
gpt4 key购买 nike

我有一个监听 UDP 多播广播并以 unsigned char* 形式读入数据的进程。

我有一个指示此 unsigned char* 中的字段的规范。

字段在规范中定义了类型和大小。

类型有:uInt32、uInt64、unsigned int 和单字节字符串。

对于单字节字符串,我只能访问unsigned char*中字段的偏移量并转换为char,例如:

char character = (char)(data[1]);

单字节 uint32 我一直在做以下事情,这似乎也有效:

uint32_t integer =  (uint32_t)(data[20]);

但是,对于多字节转换,我似乎被卡住了。

如何将一行中的几个字节(data 的子字符串)转换为相应的数据类型?

此外,将数据包装在字符串中是否安全(为了使用子字符串功能)?我担心丢失信息,因为我必须将 unsigned char* 转换为 char*,例如:

std::string wrapper((char*)(data),length);//这样安全吗?

我试过这样的:

std::string wrapper((char*)(data),length); //Is this safe?
uint32_t integer = (uint32_t)(wrapper.substr(20,4).c_str()); //4 byte int

但它不起作用。

想法?


更新

我试过建议的位移位:

void function(const unsigned char* data, size_t data_len)
{
//From specifiction: Field type: uInt32 Byte Length: 4
//All integer fields are big endian.
uint32_t integer = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | (data[3]);
}

可悲的是,这给了我垃圾(每次调用都使用相同的号码——来自回调)。

最佳答案

我认为您应该非常明确,并且不是只是用强制转换和指针做“聪明”的把戏。相反,编写如下函数:

uint32_t read_uint32_t(unsigned char **data)
{
const unsigned char *get = *data;
*data += 4;
return (get[0] << 24) | (get[1] << 16) | (get[2] << 8) | get[3];
}

这从 unsigned char 缓冲区中提取单个 uint32_t 值,并增加缓冲区指针以指向缓冲区中的下一个数据字节。

这假设大端数据,您需要对缓冲区的端模式有一个明确定义的想法才能解释它。

关于c++ - 解密无符号字符*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5031411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com