/******************************************************************************
Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, PHP, Ruby,
C#, OCaml, VB, Perl, Swift, Prolog, Javascript, Pascal, COBOL, HTML, CSS, JS
Code, Compile, Run and Debug online from anywhere in world.
*******************************************************************************/
#include <stdio.h>
#include <stdint.h>
#include <string.h> // for memset()
#include "GetPutValuesByOffset.h"
// Prototypes
void HexDump (char *text, uint8_t *ptr, unsigned int size);
// Functions
int main()
{
uint8_t u8;
uint16_t u16;
uint32_t u32;
float flt;
double dbl;
// Test 1 - get values from data bytes.
uint8_t data[] =
{
0x42, // 0: uint8_t
0x34, 0x12, // 1-2: uin16_t
0x44, 0x33, 0x22, 0x11, // 3-6: uint32_t
0x14, 0xae, 0x29, 0x42, // 7-10: float 42.42
0xf6, 0x28, 0x5c, 0x8f, 0xc2, 0x35, 0x45, 0x40 // 11-16: double 42.42
};
HexDump ("data ", data, sizeof(data));
u8 = getValueFrom (data, 0, 1).U8;
u16 = getValueFrom (data, 1, 2).U16;
u32 = getValueFrom (data, 3, 4).U32;
flt = getValueFrom (data, 7, 4).FLT;
dbl = getValueFrom (data, 11, 8).DBL;
printf ("u8=0x%02x u16=0x%04x u32=0x%08x flt=%f dbl=%f\n",
u8, u16, u32, flt, dbl);
// Test 2 - put values in buffer.
uint8_t buffer[17];
ValueUnion value;
memset (buffer, 0x0, sizeof(buffer));
value.U8 = u8;
putValueTo (buffer, 0, 1, value);
value.U16 = u16;
putValueTo (buffer, 1, 2, value);
value.U32 = u32;
putValueTo (buffer, 3, 4, value);
value.FLT = flt;
putValueTo (buffer, 7, 4, value);
value.DBL = dbl;
putValueTo (buffer, 11, 8, value);
HexDump ("buffer", buffer, 19);
// Test 3 - get values from data bytes using helper functions.
u8 = getU8From (data, 0);
u16 = getU16From (data, 1);
u32 = getU32From (data, 3);
flt = getFloatFrom (data, 7);
dbl = getDoubleFrom (data, 11);
printf ("u8=0x%02x u16=0x%04x u32=0x%08x flt=%f dbl=%f\n",
u8, u16, u32, flt, dbl);
// Test 4 - put values to buffer using helper functions.
memset (buffer, 0x0, sizeof(buffer));
putU8To (buffer, 0, u8);
putU16To (buffer, 1, u16);
putU32To (buffer, 3, u32);
putFloatTo (buffer, 7, flt);
putDoubleTo (buffer, 11, dbl);
HexDump ("buffer", buffer, 19);
return 0;
}
// Utility Functions
void HexDump (char *text, uint8_t *ptr, unsigned int size)
{
printf ("%s: ", text);
for (int idx=0; idx<size; idx++)
{
printf ("%02x ", ((uint8_t*)ptr)[idx]);
}
printf ("\n");
}
#include <stdint.h>
#include <string.h> // for memset(), memcpy()
#include "GetPutValuesByOffset.h"
ValueUnion getValueFrom(uint8_t *bufferPtr, unsigned int offset, unsigned int size)
{
ValueUnion result;
memcpy(&result, bufferPtr + offset, size);
return result;
}
void putValueTo(uint8_t *bufferPtr, unsigned int offset, unsigned int size, ValueUnion value)
{
memcpy(bufferPtr + offset, &value, size);
}
// getValue helper functions
uint8_t getU8From (uint8_t *bufferPtr, unsigned int offset)
{
return getValueFrom(bufferPtr, offset, sizeof(uint8_t)).U8;
}
uint16_t getU16From (uint8_t *bufferPtr, unsigned int offset)
{
return getValueFrom(bufferPtr, offset, sizeof(uint16_t)).U16;
}
uint32_t getU32From (uint8_t *bufferPtr, unsigned int offset)
{
return getValueFrom(bufferPtr, offset, sizeof(uint32_t)).U32;
}
float getFloatFrom (uint8_t *bufferPtr, unsigned int offset)
{
return getValueFrom(bufferPtr, offset, sizeof(float)).FLT;
}
float getDoubleFrom (uint8_t *bufferPtr, unsigned int offset)
{
return getValueFrom(bufferPtr, offset, sizeof(double)).DBL;
}
// putValue helper functions
void putU8To (uint8_t *bufferPtr, unsigned int offset, uint8_t value)
{
memcpy (bufferPtr + offset, &value, sizeof(value));
}
void putU16To (uint8_t *bufferPtr, unsigned int offset, uint16_t value)
{
memcpy (bufferPtr + offset, &value, sizeof(value));
}
void putU32To (uint8_t *bufferPtr, unsigned int offset, uint32_t value)
{
memcpy (bufferPtr + offset, &value, sizeof(value));
}
void putFloatTo (uint8_t *bufferPtr, unsigned int offset, float value)
{
memcpy (bufferPtr + offset, &value, sizeof(value));
}
void putDoubleTo (uint8_t *bufferPtr, unsigned int offset, double value)
{
memcpy (bufferPtr + offset, &value, sizeof(value));
}
#include <stdint.h>
// Typedefs
typedef union value_t {
uint8_t U8;
int8_t S8;
uint16_t U16;
int16_t S16;
uint32_t U32;
int32_t S32;
float FLT;
double DBL;
} ValueUnion;
// Prototypes
ValueUnion getValueFrom(uint8_t *bufferPtr, unsigned int offset, unsigned int size);
void putValueTo(uint8_t *bufferPtr, unsigned int offset, unsigned int size, ValueUnion value);
uint8_t getU8From (uint8_t *bufferPtr, unsigned int offset);
uint16_t getU16From (uint8_t *bufferPtr, unsigned int offset);
uint32_t getU32From (uint8_t *bufferPtr, unsigned int offset);
float getFloatFrom (uint8_t *bufferPtr, unsigned int offset);
float getDoubleFrom (uint8_t *bufferPtr, unsigned int offset);
void putU8To (uint8_t *bufferPtr, unsigned int offset, uint8_t value);
void putU16To (uint8_t *bufferPtr, unsigned int offset, uint16_t value);
void putU32To (uint8_t *bufferPtr, unsigned int offset, uint32_t value);
void putFloatTo (uint8_t *bufferPtr, unsigned int offset, float value);
void putDoubleTo (uint8_t *bufferPtr, unsigned int offset, double value);