1 #include "otsdaq/Macros/BinaryStringMacros.h"
12 const void* binaryBuffer,
13 unsigned int numberOfBytes,
14 const std::string& resultPreamble,
15 const std::string& resultDelimiter)
18 dest.reserve(numberOfBytes * 2);
21 for(
unsigned int i = 0; i < numberOfBytes; ++i)
23 sprintf(hexstr,
"%02X", (
unsigned char)((
const char*)binaryBuffer)[i]);
25 dest += resultDelimiter;
28 return resultPreamble + dest;
35 std::string BinaryStringMacros::binaryNumberToHexString(
36 const std::string& binaryBuffer,
37 const std::string& resultPreamble ,
38 const std::string& resultDelimiter )
40 return binaryNumberToHexString(
41 &binaryBuffer[0], binaryBuffer.size(), resultPreamble, resultDelimiter);
48 std::string BinaryStringMacros::binaryNumberToHexString(
49 const void* binaryBuffer,
50 unsigned int numberOfBytes,
51 const std::string& resultPreamble ,
52 const std::string& resultDelimiter )
55 dest.reserve(numberOfBytes * 2 + resultDelimiter.size() * (numberOfBytes / 8) +
56 resultPreamble.size());
59 dest += resultPreamble;
62 for(; j + 8 < numberOfBytes; j += 8)
65 dest += resultDelimiter;
66 for(
unsigned int k = 0; k < 8; ++k)
70 (
unsigned char)((
const char*)binaryBuffer)[7 - k + j * 8]);
74 for(
unsigned int k = numberOfBytes - 1; k >= j; --k)
76 sprintf(hexstr,
"%02X", (
unsigned char)((
const char*)binaryBuffer)[k]);
89 const std::string& value,
90 unsigned int bitIndex )
95 __SS__ <<
"String value must be a valid number! Value was " << value << __E__;
99 if(dataType ==
"double")
102 if(!StringMacros::getNumber<double>(value, v))
104 __SS__ <<
"String double value must be a valid number! Value was " << value
108 BinaryStringMacros::insertValueInBinaryString<double>(binaryBuffer, v, bitIndex);
112 unsigned long long v;
113 if(!StringMacros::getNumber<unsigned long long>(value, v))
115 __SS__ <<
"String unsigned long long value must be a valid number! Value was "
119 BinaryStringMacros::insertValueInBinaryString<unsigned long long>(
120 binaryBuffer, v, bitIndex);
129 unsigned int bufferNumberOfBytes,
131 unsigned int valueNumberOfBits,
132 unsigned int bitIndex )
138 if(valueNumberOfBits == 0)
140 __SS__ <<
"Can not extract value of size 0!" << __E__;
144 if(bitIndex + valueNumberOfBits > bufferNumberOfBytes * 8)
146 __SS__ <<
"Can not extract value of size " << valueNumberOfBits
147 <<
", at position " << bitIndex <<
", from buffer of size "
148 << bufferNumberOfBytes * 8 <<
"." << __E__;
152 unsigned char* value = (
unsigned char*)valueVoid;
153 const unsigned char* binaryBuffer = (
const unsigned char*)binaryBufferVoid;
154 unsigned int byteOffset = bitIndex / 8;
155 unsigned int bitOffset = bitIndex % 8;
156 unsigned int bitsLeft = valueNumberOfBits;
160 unsigned int valuei = 0;
171 value[valuei] = binaryBuffer[byteOffset] >> bitOffset;
173 value[valuei] |= binaryBuffer[byteOffset + 1] << (8 - bitOffset);
183 unsigned char keepMask = ((
unsigned char)(-1)) >> (8 - bitsLeft);
184 value[valuei] &= keepMask;
205 unsigned int valueNumberOfBits,
206 unsigned int bitIndex )
208 value.resize((valueNumberOfBits / 8) + ((valueNumberOfBits % 8) ? 1 : 0));
210 &binaryBuffer[0], binaryBuffer.size(), &value[0], valueNumberOfBits, bitIndex);
static std::string binaryStringToHexString(const void *binaryBuffer, unsigned int numberOfBytes, const std::string &resultPreamble="", const std::string &resultDelimiter="")
static void extractValueFromBinaryString(const std::string &binaryBuffer, T &value, unsigned int bitIndex=0)
static void insertValueInBinaryString(std::string &binaryBuffer, T value, unsigned int bitIndex=0)
static std::string getNumberType(const std::string &stringToCheck)
Note: before call consider use of stringToCheck = StringMacros::convertEnvironmentVariables(stringToC...