during the import of a complex file format I handle ByteArray or lists of byte values. While I can easy transform them from one type to each other:
ba=ByteArray[{1,2,3,4,5,6}];
Normal[ba]
I have problems taking specific bytes of my list and converting them according a given number format e.g. Integer8, Integer32 or Real32.
Normal@ba[[1;;2]] (*Shall interpretet as Integer16*)
Normal@ba[[3;;6]] (*Shall interpretet as Real32*)
Is there an internal and elegant way to do so?
I wrote a workaround for Integer numbers like below but I would guess an internal solution will be way more efficient ...
ByteToInteger[byteArray_,LSBStart_:True,bitSize_:16,signed_:False] :=
Module[{i,array=byteArray,value=0},
(*Reverse for LSB*)
If[LSBStart==False,
array=Reverse[array];
];
array=PadLeft[array,bitSize]
(*calculate Unsigned value*)
value=array[[1]];
For[i=2,i<=Length@array,i++,
value=value+array[[i]]*256^(i-1)
];
(*adapt to signed if needed*)
If[signed==True&&value>=2^(bitSize-1),
value=-(2^bitSize-(value-2^(bitSize-1)))
];
value
]
I am open to any suggestions ...