#include "amf3.h" #include #include 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; } }