我有一个字节数组,如果我只想在该数组的特定位置使用X个字节,我想知道这是否有效。
此外我的代码崩溃了,下面的一段代码也提供给了我..但它崩溃了我的系统,不知道为什么。
rawDataPtr是我的字节数组,因为你可以猜测我感兴趣的值是从positon 4开始的。
float TempFloat = COMMON_ConvertByteArrayToFloat(&rawDataPtr[3]);
现在的功能。
union {
uint8_t tmpArray[4];
float tmpFloat;
}value;
float COMMON_ConvertByteArrayToFloat(uint8_t *data) {
value.tmpArray[0] = data[3];
value.tmpArray[1] = data[2];
value.tmpArray[2] = data[1];
value.tmpArray[3] = data[0];
return value.tmpFloat;
}
答案 0 :(得分:1)
我有一个字节数组,如果我只想在该数组的特定位置使用X个字节,我想知道这是否有效。
假设“array”rawDataPtr
至少有四个元素,&rawDataPtr[3]
是指向第四个元素的有效指针。如果元素类型与uint8_t
不同,那么当您将其传递给函数时,技术上应该强制转换为uint8_t *
:
float TempFloat = COMMON_ConvertByteArrayToFloat((uint8_t *) &rawDataPtr[3]);
......但在实践中不太可能产生任何影响。
你的功能本身就很好。特别是,
像访问data[0]
... data[3]
一样没有问题,只要 data
是有效指针, data[3]
不构成尝试超出data
指向的对象(in)的范围。在您使用的用法中,对应于rawDataPtr
是至少7个字节的数组。
允许写入一个联合的一个元素,然后从另一个元素中读取,尽管有一些警告。特别是,您的代码假定float
的大小为4个字节;如果它们在您的系统上更长,则您的代码具有未指定的行为。
附加说明:
我假设您有意从数组中反转字节顺序以形成float
的值。这是否合适取决于您的特定数据。
如果您要执行字节 - >通过union进行float转换,然后建议使用函数本地的union对象。您目前似乎正在使用文件范围的实例。
您的函数完全能够在value.tmpFloat
中生成陷阱表示,然后尝试读取并返回该值。如果是这样,那么结果行为是未定义的。
总的来说,如果函数崩溃你的程序,那是因为你正在为它提供坏数据。在这种情况下,调用者的rawDataPtr
可能不是有效指针(并注意它的名称表明它是指针而不是数组),或者指向更少的指针在对象结束之前的四个字节,或它指向的字节在转换时形成陷阱表示。