blob: ca4a849c3f7d0fc1a5c6314da8054fc1a7c48ae9 [file] [log] [blame]
kasunath0aa36d82022-11-23 14:24:15 -08001#include "bej_common.h"
kasunath7ffd30a2022-05-10 18:11:34 -07002
kasunath0aa36d82022-11-23 14:24:15 -08003uint64_t bejGetUnsignedInteger(const uint8_t* bytes, uint8_t numOfBytes)
kasunath7ffd30a2022-05-10 18:11:34 -07004{
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
kasunath0aa36d82022-11-23 14:24:15 -080013uint64_t bejGetNnint(const uint8_t* nnint)
kasunath7ffd30a2022-05-10 18:11:34 -070014{
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;
kasunath0aa36d82022-11-23 14:24:15 -080018 return bejGetUnsignedInteger(nnint + sizeof(uint8_t), size);
kasunath7ffd30a2022-05-10 18:11:34 -070019}
20
kasunath0aa36d82022-11-23 14:24:15 -080021uint8_t bejGetNnintSize(const uint8_t* nnint)
kasunath7ffd30a2022-05-10 18:11:34 -070022{
23 // In nnint, first byte indicate how many bytes are there.
24 return *nnint + sizeof(uint8_t);
25}
kasunath99bd6c92023-07-30 18:19:00 -070026
kasunath061fbc62023-08-01 18:09:08 -070027uint8_t bejIntLengthOfValue(int64_t val)
28{
29 // Only need to encode 0x00 or 0xFF
30 if (val == 0 || val == -1)
31 {
32 return 1;
33 }
34
35 // Starts at the MSB. LSB index is 0.
36 uint8_t byteIndex = sizeof(uint64_t) - 1;
37 const uint8_t bitsPerByte = 8;
38 // The current byte being looked at. Starts at MSB.
39 uint8_t currentByte = (val >> (bitsPerByte * byteIndex)) & 0xFF;
40 uint8_t byteLength = sizeof(int64_t);
41
42 while ((val > 0 && currentByte == 0) || (val < 0 && currentByte == 0xFF))
43 {
44 byteLength--;
45 byteIndex--;
46 currentByte = (val >> (bitsPerByte * byteIndex)) & 0xFF;
47 }
48
49 // If the value is positive and encoded MSBbit is 1 we need to add 0x00 to
50 // the encoded value as padding.
51 if (val > 0 && (currentByte & 0x80))
52 {
53 byteLength++;
54 }
55
56 // If the value is negative and encoded MSBbit is 0 we need to add 0xFF to
57 // the encoded value as padding.
58 if (val < 0 && !(currentByte & 0x80))
59 {
60 byteLength++;
61 }
62
63 return byteLength;
64}
65
kasunath99bd6c92023-07-30 18:19:00 -070066uint8_t bejNnintEncodingSizeOfUInt(uint64_t val)
67{
68 uint8_t bytes = 0;
69 do
70 {
71 // Even if the value is 0, we need a byte for that.
72 ++bytes;
73 val = val >> 8;
74 } while (val != 0);
75 // Need 1 byte to add the nnint length.
76 return bytes + 1;
77}
78
79uint8_t bejNnintLengthFieldOfUInt(uint64_t val)
80{
81 // From the size of the encoded value, we need 1 byte for the length field.
82 return bejNnintEncodingSizeOfUInt(val) - 1;
83}