xref: /openbmc/libbej/src/bej_common.c (revision 99bd6c909c01e2ad0f7838216b826dd87989e0d4)
1 #include "bej_common.h"
2 
3 uint64_t bejGetUnsignedInteger(const uint8_t* bytes, uint8_t numOfBytes)
4 {
5     uint64_t num = 0;
6     for (uint8_t i = 0; i < numOfBytes; ++i)
7     {
8         num |= (uint64_t)(*(bytes + i)) << (i * 8);
9     }
10     return num;
11 }
12 
13 uint64_t bejGetNnint(const uint8_t* nnint)
14 {
15     // In nnint, first byte indicate how many bytes are there. Remaining bytes
16     // represent the value in little-endian format.
17     const uint8_t size = *nnint;
18     return bejGetUnsignedInteger(nnint + sizeof(uint8_t), size);
19 }
20 
21 uint8_t bejGetNnintSize(const uint8_t* nnint)
22 {
23     // In nnint, first byte indicate how many bytes are there.
24     return *nnint + sizeof(uint8_t);
25 }
26 
27 uint8_t bejNnintEncodingSizeOfUInt(uint64_t val)
28 {
29     uint8_t bytes = 0;
30     do
31     {
32         // Even if the value is 0, we need a byte for that.
33         ++bytes;
34         val = val >> 8;
35     } while (val != 0);
36     // Need 1 byte to add the nnint length.
37     return bytes + 1;
38 }
39 
40 uint8_t bejNnintLengthFieldOfUInt(uint64_t val)
41 {
42     // From the size of the encoded value, we need 1 byte for the length field.
43     return bejNnintEncodingSizeOfUInt(val) - 1;
44 }
45