0. Environment

mysqld  Ver 5.7.19-log for osx10.12 on x86_64 (Homebrew)

$mysql ll *mysql-bin*
-rw-r-----  1 nuc  admin   974B 12  7 18:56 mysql-bin.000001
-rw-r-----  1 nuc  admin    38K 12  8 15:44 mysql-bin.000002
-rw-r-----  1 nuc  admin    38B 12  7 18:56 mysql-bin.index

1. Look at the file

$mysql xxd mysql-bin.000001|more
00000000: fe62 696e 7bfd 285a 0f01 0000 0077 0000  .bin{.(Z.....w..
00000010: 007b 0000 0000 0004 0035 2e37 2e31 392d  .{.......5.7.19-
00000020: 6c6f 6700 0000 0000 0000 0000 0000 0000  log.............
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 007b fd28 5a13  ...........{.(Z.

$mysql mysqlbinlog mysql-bin.000001|more
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#171207 16:36:11 server id 1  end_log_pos 123 CRC32 0xfbd38efa  Start: binlog v 4, server v 5.7.19-log created 171207 16:36:11 at startup
ROLLBACK/*!*/;
BINLOG '
e/0oWg8BAAAAdwAAAHsAAAAAAAQANS43LjE5LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAB7/ShaEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AfqO0/s=
'/*!*/;
# at 123

2. Step by Step

//sql/log_event.h:459
/* 4 bytes which all binlogs should begin with */
#define BINLOG_MAGIC        "\\\\xfe\\\\x62\\\\x69\\\\x6e"

php > echo bin2hex(pack("L",strtotime('2017-12-07 16:36:11')));
7bfd285a

//sql/log_event.h:634
/**
  @enum Log_event_type

  Enumeration type for the different types of log events.
*/
enum Log_event_type
{
  /*
    Every time you update this enum (when you add a type), you have to
    fix Format_description_log_event::Format_description_log_event().
  */
  UNKNOWN_EVENT= 0,
  START_EVENT_V3= 1,
  QUERY_EVENT= 2,
  STOP_EVENT= 3,
  ROTATE_EVENT= 4,
  INTVAR_EVENT= 5,
  LOAD_EVENT= 6,
  SLAVE_EVENT= 7,  /* Unused. Slave_log_event code has been removed. (15th Oct. 2010) */
  CREATE_FILE_EVENT= 8,
  APPEND_BLOCK_EVENT= 9,
  EXEC_LOAD_EVENT= 10,
  DELETE_FILE_EVENT= 11,
  /*
    NEW_LOAD_EVENT is like LOAD_EVENT except that it has a longer
    sql_ex, allowing multibyte TERMINATED BY etc; both types share the
    same class (Load_log_event)
  */
  NEW_LOAD_EVENT= 12,
  RAND_EVENT= 13,
  USER_VAR_EVENT= 14,
  FORMAT_DESCRIPTION_EVENT= 15,
  XID_EVENT= 16,
  BEGIN_LOAD_QUERY_EVENT= 17,
  EXECUTE_LOAD_QUERY_EVENT= 18,

  TABLE_MAP_EVENT = 19,

  /*
    These event numbers were used for 5.1.0 to 5.1.15 and are
    therefore obsolete.
   */
  PRE_GA_WRITE_ROWS_EVENT = 20,
  PRE_GA_UPDATE_ROWS_EVENT = 21,
  PRE_GA_DELETE_ROWS_EVENT = 22,

  /*
    These event numbers are used from 5.1.16 until mysql-trunk-xx
   */
  WRITE_ROWS_EVENT_V1 = 23,
  UPDATE_ROWS_EVENT_V1 = 24,
  DELETE_ROWS_EVENT_V1 = 25,

  /*
    Something out of the ordinary happened on the master
   */
  INCIDENT_EVENT= 26,

  /*
    Heartbeat event to be send by master at its idle time
    to ensure master's online status to slave
  */
  HEARTBEAT_LOG_EVENT= 27,

  /*
    In some situations, it is necessary to send over ignorable
    data to the slave: data that a slave can handle in case there
    is code for handling it, but which can be ignored if it is not
    recognized.
  */
  IGNORABLE_LOG_EVENT= 28,
  ROWS_QUERY_LOG_EVENT= 29,

  /* Version 2 of the Row events */
  WRITE_ROWS_EVENT = 30,
  UPDATE_ROWS_EVENT = 31,
  DELETE_ROWS_EVENT = 32,

  GTID_LOG_EVENT= 33,
  ANONYMOUS_GTID_LOG_EVENT= 34,

  PREVIOUS_GTIDS_LOG_EVENT= 35,
  /*
    Add new events here - right above this comment!
    Existing events (except ENUM_END_EVENT) should never change their numbers
  */

  ENUM_END_EVENT /* end marker */
};

$mysql cat /etc/my.cnf
[mysqld]
log-bin    = mysql-bin
server-id  = 1
binlog_format=row