public ChirpBinaryMessage(byte[] bytes) {
   DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes));
   try {
     byte type = dis.readByte();
     if (type != MessageType.ChirpMessage.typeValue) {
       throw new IllegalArgumentException("This isn't a chirp message!");
     }
     byte from = dis.readByte();
     byte to = dis.readByte();
     int messageId = dis.readInt();
     EnumSet<IChirpMessage.MessageFlags> flags = ChirpMessage.flagSetFromByte(dis.readByte());
     String sender = dis.readUTF();
     String recipient = dis.readUTF();
     String messageStr = dis.readUTF();
     this.message = new ChirpMessage(from, to, messageId, flags, sender, recipient, messageStr);
   } catch (IOException ex) {
     throw new RuntimeException(ex);
   }
 }