MessagePack: serialize round floats as integers (fixes #1718)

This commit is contained in:
Benoit Blanchon
2022-02-28 18:00:43 +01:00
parent ff06292d74
commit e3e375f5cd
3 changed files with 24 additions and 7 deletions

View File

@ -23,6 +23,11 @@ class MsgPackSerializer : public Visitor<size_t> {
template <typename T>
typename enable_if<sizeof(T) == 4, size_t>::type visitFloat(T value32) {
if (canConvertNumber<Integer>(value32)) {
Integer truncatedValue = Integer(value32);
if (value32 == T(truncatedValue))
return visitSignedInteger(truncatedValue);
}
writeByte(0xCA);
writeInteger(value32);
return bytesWritten();
@ -32,13 +37,10 @@ class MsgPackSerializer : public Visitor<size_t> {
ARDUINOJSON_NO_SANITIZE("float-cast-overflow")
typename enable_if<sizeof(T) == 8, size_t>::type visitFloat(T value64) {
float value32 = float(value64);
if (value32 == value64) {
writeByte(0xCA);
writeInteger(value32);
} else {
writeByte(0xCB);
writeInteger(value64);
}
if (value32 == value64)
return visitFloat(value32);
writeByte(0xCB);
writeInteger(value64);
return bytesWritten();
}