96 lines
1.5 KiB
C
96 lines
1.5 KiB
C
#include "amf3.h"
|
|
#include <string.h>
|
|
#include <assert.h>
|
|
|
|
static double s_double = 1.0; // 3ff0 0000 0000 0000
|
|
|
|
const uint8_t* AMF3ReadNull(const uint8_t* ptr, const uint8_t* end)
|
|
{
|
|
(void)end;
|
|
return ptr;
|
|
}
|
|
|
|
const uint8_t* AMF3ReadBoolean(const uint8_t* ptr, const uint8_t* end)
|
|
{
|
|
(void)end;
|
|
return ptr;
|
|
}
|
|
|
|
const uint8_t* AMF3ReadInteger(const uint8_t* ptr, const uint8_t* end, int32_t* value)
|
|
{
|
|
int i;
|
|
int32_t v = 0;
|
|
|
|
for (i = 0; i < 3 && ptr + i < end && (0x80 & ptr[i]); i++)
|
|
{
|
|
v <<= 7;
|
|
v |= (ptr[i] & 0x7F);
|
|
}
|
|
|
|
if (ptr + i >= end)
|
|
return NULL;
|
|
|
|
if (3 == i)
|
|
{
|
|
v <<= 8;
|
|
v |= ptr[i];
|
|
|
|
if (v >= (1 << 28))
|
|
v -= (1 << 29);
|
|
}
|
|
else
|
|
{
|
|
v <<= 7;
|
|
v |= ptr[i];
|
|
}
|
|
|
|
*value = v;
|
|
return ptr + i + 1;
|
|
}
|
|
|
|
const uint8_t* AMF3ReadDouble(const uint8_t* ptr, const uint8_t* end, double* value)
|
|
{
|
|
uint8_t* p = (uint8_t*)value;
|
|
if (!ptr || end - ptr < 8)
|
|
return NULL;
|
|
|
|
if (value)
|
|
{
|
|
if (0x00 == *(char*)&s_double)
|
|
{// Little-Endian
|
|
*p++ = ptr[7];
|
|
*p++ = ptr[6];
|
|
*p++ = ptr[5];
|
|
*p++ = ptr[4];
|
|
*p++ = ptr[3];
|
|
*p++ = ptr[2];
|
|
*p++ = ptr[1];
|
|
*p++ = ptr[0];
|
|
}
|
|
else
|
|
{
|
|
memcpy(&value, ptr, 8);
|
|
}
|
|
}
|
|
return ptr + 8;
|
|
}
|
|
|
|
const uint8_t* AMF3ReadString(const uint8_t* ptr, const uint8_t* end, char* string, uint32_t* length)
|
|
{
|
|
uint32_t v;
|
|
ptr = AMF3ReadInteger(ptr, end, (int32_t*)&v);
|
|
|
|
if (v & 0x01)
|
|
{
|
|
// reference
|
|
return ptr;
|
|
}
|
|
else
|
|
{
|
|
*length = v >> 1;
|
|
memcpy(string, ptr, *length);
|
|
string[*length] = 0;
|
|
return ptr + *length;
|
|
}
|
|
}
|