From 537a6a6727de0524974dd23bb2988de0b1b7362f Mon Sep 17 00:00:00 2001 From: Anatoly Rugalev Date: Sun, 5 Feb 2023 19:47:58 +0100 Subject: [PATCH] fix(real): add support for 4-byte long real numbers --- binary_parser.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/binary_parser.go b/binary_parser.go index 5cf00fc..7d2c051 100644 --- a/binary_parser.go +++ b/binary_parser.go @@ -253,11 +253,22 @@ func (bp *binaryParser) parseReal(marker byte) (*plistValue, error) { if _, err := bp.Read(buf); err != nil { return nil, err } - var r float64 - if err := binary.Read(bytes.NewReader(buf), binary.BigEndian, &r); err != nil { - return nil, err + switch len(buf) { + case 4: + var r float32 + if err := binary.Read(bytes.NewReader(buf), binary.BigEndian, &r); err != nil { + return nil, err + } + return &plistValue{Real, sizedFloat{float64(r), nbytes * 8}}, nil + case 8: + var r float64 + if err := binary.Read(bytes.NewReader(buf), binary.BigEndian, &r); err != nil { + return nil, err + } + return &plistValue{Real, sizedFloat{r, nbytes * 8}}, nil + default: + return nil, fmt.Errorf("plist: invalid length of real number: expected: 4 or 8, got: %d", len(buf)) } - return &plistValue{Real, sizedFloat{r, nbytes * 8}}, nil } func (bp *binaryParser) parseDate(marker byte) (*plistValue, error) {