public static byte[] bytesFromValue(final Value value) throws UnsupportedEncodingException {
        byte[] bytes;
        switch (value.getType()) {
            case NIL:
                bytes = new byte[]{NIL};
                break;
            case BOOLEAN:
                if (value.getBooleanValue()) {
                    bytes = new byte[]{BOOLEAN, 0x01};
                } else {
                    bytes = new byte[]{BOOLEAN, 0x00};
                }
                break;
            case INTEGER: {
                final byte[] intBytes = ByteInteger.bytesFromInt(value.getIntegerValue());
                bytes = new byte[]{
                    INTEGER,
                    intBytes[ByteInteger.FIRST_BYTE],
                    intBytes[ByteInteger.SECOND_BYTE],
                    intBytes[ByteInteger.THIRD_BYTE],
                    intBytes[ByteInteger.FOURTH_BYTE],
                };
                break;
            }
            case FLOAT: {
                final byte[] floatBytes = ByteFloat.bytesFromFloat(value.getFloatValue());
                bytes = new byte[]{
                    FLOAT,
                    floatBytes[ByteInteger.FIRST_BYTE],
                    floatBytes[ByteInteger.SECOND_BYTE],
                    floatBytes[ByteInteger.THIRD_BYTE],
                    floatBytes[ByteInteger.FOURTH_BYTE],
                };
                break;
            }
            case STRING: {
                final byte[] stringBytes = ByteString.bytesFromString(value.getStringValue());
                bytes = new byte[stringBytes.length + 2];
                bytes[0] = STRING;
                bytes[1] = (byte) stringBytes.length;
                for (int i = 0; i < stringBytes.length; ++i) {
                    bytes[(i + 2)] = stringBytes[i];
                }
                break;
            }
            default:
                throw new IllegalArgumentException("Unrecognized type byte: " + value.getType() + "!");
        }
        return bytes;
    }