** Copyright (C) 2001-2025 Zabbix SIA
** This program is free software: you can redistribute it and/or modify it under the terms of
** the GNU Affero General Public License as published by the Free Software Foundation, version 3.
** This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
** without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
** See the GNU Affero General Public License for more details.
** You should have received a copy of the GNU Affero General Public License along with this program.
** If not, see <https://www.gnu.org/licenses/>.
// main data transformation
func pack2Json(val []byte, p *mbParams) (jdata interface{}, err error) {
ar := getArr16(p.RetType, uint(p.Count), val)
if len(ar) < int(p.Offset) {
return nil, fmt.Errorf("Wrong length of received data: %d", len(ar))
jd, jerr := json.Marshal(ar)
return nil, fmt.Errorf("Unable to create json: %s", jerr)
if len(val) < int(p.Offset*2) {
return nil, fmt.Errorf("Wrong length of received data: %d", len(val))
case Int32, Uint32, Float:
if typeSize == 1 && p.Endianness.order == binary.LittleEndian {
arr = swapPairByte(val, p.RetType, p.RetCount)
arr = makeRetArray(p.RetType, p.RetCount)
r := bytes.NewReader(val)
if err = binary.Read(r, p.Endianness.order, arr); err != nil {
return nil, fmt.Errorf("Unable to convert returned data: %w", err)
if typeSize > 2 && 0 != p.Endianness.middle {
arr = middlePack(arr, p.RetType)
return getFirst(arr), nil
arr = getArr16(p.RetType, p.RetCount, arr.([]byte))
jd, jerr := json.Marshal(arr)