`

Arc-03-26-相册图片短码编码实现

 
阅读更多

应用中需要上传用户图片,不想数据库单独维护图片的信息,想直接从编码定位到图片文件,又不想编码太长,所以需要压缩数字串。

 

 

/**
 * 64进制和10进制的转换类
 * 
 * @author 
 * 
 */
public class compressEncodeing {
	final static String PHOTOS_PREFIX = "H";
	final static String DEFUALT_IMAGE_SUBFIX = ".jpg";
	final static String PLACEHOLDER = "-";
	final static String UNDERLINE = "_";
	final static String SEPARATOR = "/";
	final static String DOT = ".";
	final static String[] IMAGES_TYPE = { "bmp", "gif", "jpg", "png" };
	final static char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
			'9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
			'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
			'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
			'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
			'Z', '+', '/', };

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String url = getEncodePhotoUrl(1234567890, "png");
		System.out.println(url);

		url = getDecodePhotoName(url + "_640x480.png");

		System.out.println(url);

	}

	/**
	 * 根据 userID 返回图片的 URL 编码 编码规则,共四段组成
	 * 编码前:H(1位长相册类型)-1234567890(10位长用户ID)-1325137433192(13位毫秒)-2(1位随机码)-3
	 * (图片类型码) 编码后:H(1位长相册相册)19Bwbi(6位长用户ID)ji8m99E(7位毫秒)-n(1位随机码)
	 * 例:H19Bwbiji8m99E-n
	 * 
	 * @param userID
	 * @param shift
	 * @return encoded url
	 */
	public static String getEncodePhotoUrl(long userID, String suffix) {
		int suffixCode = -1;
		for (int i = 0; i < IMAGES_TYPE.length; i++) {
			if (IMAGES_TYPE[i].indexOf(suffix) != -1) {
				suffixCode = i;
				break;
			}
		}
		return PHOTOS_PREFIX
				+ prefixFormat(CompressNumber(userID, 6), 6)
				+ prefixFormat(CompressNumber(System.currentTimeMillis(), 6), 7)
				+ (CompressNumber((int) (Math.random() * 10), 6))
				+ (suffixCode == -1 ? 0 : suffixCode);
	}

	/**
	 * 根据编码后的图片的 URL 返回真实的图片文件名 编码规则
	 * 解码前:H(1位长相册相册)19Bwbi(6位长用户ID)ji8m99E(7位毫秒)-n(2位随机码)_640x480(size).png(后缀)
	 * 解码后:H(1位长相册类型)/1234567890(10位长用户ID)/1325137433192(13位毫秒)23(2位随机码)
	 * 例:H19Bwbiji8m99E-n_640x480.png ->
	 * /H/1234567890/132513743319223_640x480.png
	 * 
	 * @param url
	 * @return decoded photo file name
	 */
	public static String getDecodePhotoName(String url) {
		// 必须是大于 16位
		if (url == null || url.length() < 16)
			return null;
		String encodedUrl = url.substring(0, url.indexOf(UNDERLINE));
		// 有效编码必须是 16 位
		if (encodedUrl == null || encodedUrl.length() != 16)
			return null;

		String size = url.substring(url.indexOf(UNDERLINE), url.indexOf(DOT));
		String suffix = url.substring(url.indexOf(DOT), url.length());

		return encodedUrl.substring(0, 1) + SEPARATOR
				+ UnCompressNumber(encodedUrl.substring(1, 7)) + SEPARATOR
				+ UnCompressNumber(encodedUrl.substring(7, 14))
				+ UnCompressNumber(encodedUrl.substring(14, 15)) + size
				+ suffix;

	}

	/**
	 * 把10进制的数字转换成64进制
	 * 
	 * @param number
	 * @param shift
	 * @return
	 */
	private static String CompressNumber(long number, int shift) {
		char[] buf = new char[64];
		int charPos = 64;
		int radix = 1 << shift;
		long mask = radix - 1;
		do {
			buf[--charPos] = digits[(int) (number & mask)];
			number >>>= shift;
		} while (number != 0);
		return new String(buf, charPos, (64 - charPos));
	}

	/**
	 * 把64进制的字符串转换成10进制
	 * 
	 * @param decompStr
	 * @return
	 */
	private static long UnCompressNumber(String decompStr) {
		long result = 0;
		for (int i = decompStr.length() - 1; i >= 0; i--) {
			if (i == decompStr.length() - 1) {
				result += getCharIndexNum(decompStr.charAt(i));
				continue;
			}
			for (int j = 0; j < digits.length; j++) {
				if (decompStr.charAt(i) == digits[j]) {
					result += ((long) j) << 6 * (decompStr.length() - 1 - i);
				}
			}
		}
		return result;
	}

	/**
	 * 
	 * @param ch
	 * @return
	 */
	private static long getCharIndexNum(char ch) {
		int num = ((int) ch);
		if (num >= 48 && num <= 57) {
			return num - 48;
		} else if (num >= 97 && num <= 122) {
			return num - 87;
		} else if (num >= 65 && num <= 90) {
			return num - 29;
		} else if (num == 43) {
			return 62;
		} else if (num == 47) {
			return 63;
		}
		return 0;
	}

	/**
	 * 格式化文本,按固定长度,位数不够在前面补“-”
	 * 
	 * @param soucre
	 *            原来的文本
	 * @param length
	 *            固定长度值
	 * @return String 格式化后文本
	 */
	public static String prefixFormat(String soucre, int length) {
		//
		return String.format("%" + length + "s", soucre).replaceAll(" ",
				PLACEHOLDER);
	}
}
分享到:
评论

相关推荐

    OSX-Arc-White-v1.3.7.tar.gz

    "OSX-Arc-White-v1.3.7.tar.gz" 是一个专为Gnome桌面环境设计的苹果风格主题的压缩包文件,旨在将苹果Mac OS X的美观界面风格引入Linux世界,尤其是那些喜欢苹果简洁、优雅设计的Gnome用户。 首先,我们要了解Gnome...

    dcm4chee-arc-5.22.1-mysql.zip

    **dcm4chee-arc-5.22.1-mysql.zip** 是一个与医疗影像管理和归档相关的软件包,它是 **dcm4che** 开源项目的一个组件。dcm4chee 设计用于满足 **IHE (Integrating the Healthcare Enterprise)** 的规范,这是一个...

    3D-arc-robot-vision.zip

    3D-arc-robot-vision.zip,麻省理工学院普林斯顿视觉工具箱,用于在2017亚马逊机器人挑战赛中进行机器人拾取和放置-机器人抓取和一次识别具有深度学习的新物体。,3D建模使用专门的软件来创建物理对象的数字模型。它是...

    Arc-u-boot-1.1.3-20060612.tar.gz_ARC CPU_arc u-bo_arc600 verilog

    "Arc-u-boot-1.1.3-20060612.tar.gz" 是一个软件包的名称,其中包含了特定版本的U-BOOT(即1.1.3)针对ARC CPU的定制实现。"ARCU CPU"可能是"ARC User Bootloader"的缩写,是为ARC处理器设计的引导加载程序。"arc600...

    ICOM ARC-20

    **ICOM ARC-20详解** ICOM ARC-20是一款专为无线电爱好者设计的电台控制软件,由知名无线电设备制造商ICOM生产。这款软件主要用于配合ICOM的某些特定型号的电台设备,如ICOM R20接收机,提供丰富的功能以增强用户的...

    Arc-length.rar_ARC length_MATLAB 弧长法_arc-length_buckling_结构稳定

    "弧长法"(Arc-length method)是一种常用的数值方法,用于解决非线性问题,特别是涉及结构稳定性的计算。在MATLAB环境中,可以利用编程来实现这一方法。本压缩包中的"Arc-length.rar"包含了两个关键的MATLAB脚本...

    arc-flatabulous-theme, 带有Flatabulous窗口控件的arc 主题.zip

    arc-flatabulous-theme, 带有Flatabulous窗口控件的arc 主题 arc-flatabulous主题arc Flatabulous主题是带有 Flatabulous 窗口控件的 arc 主题。 arc-flatabulous可以用于三种变体 arc-flatabulous Arc-Flatabul

    Python库 | arc-py-0.5.tar.gz

    标题中的"Python库 | arc-py-0.5.tar.gz"指的是一个名为"arc-py"的Python库的版本0.5,它被压缩在".tar.gz"格式的文件中。这种格式通常用于Linux和Unix系统中,它将多个文件打包成一个单一的归档文件,并使用gzip...

    Arc-1.37.0-48361

    Arc-1.37.0-48361

    fanuc弧焊机器人arc-mate说明书

    ### FANUC Arc-Mate 100iC 系列弧焊机器人基本描述与特点 FANUC Arc-Mate 100iC 系列是一款专为精确、高速焊接和切割设计的六轴模块化结构电动伺服驱动机器人。该系列包括 Arc-Mate 100iC 和 Arc-Mate 100iC/6L 两...

    arc_length.rar_ARC length_NJ2F_arc-length_arc_length_shakebt2

    在IT领域,"arc_length.rar_ARC length_NJ2F_arc-length_arc_length_shakebt2"这个标题可能指的是一个关于弧长参数化方法的压缩文件,其中包含了与弧长编码(Arc-length coding)相关的资料。描述中的"Arc-length ...

    dcm4chee-arc.xml

    此外,dcm4chee-arc-logstash.xml文件可能用于日志收集和分析,这是系统监控和故障排查的重要部分。Logstash是一个强大的日志管理和分析工具,它可以将dcm4chee的运行日志收集并转发到中央的日志存储,以便进行实时...

    Atom-atom-arc-dark-ui,arc dark是一个atom ui主题。为Lioneil/Atom做出贡献.zip

    "Atom-atom-arc-dark-ui,arc dark"是针对Atom编辑器的一个UI(用户界面)主题,设计风格为深色系,旨在提供舒适且对眼睛友好的编码环境。这个主题由Lioneil为Atom社区贡献,增加了编辑器的美观性和个性化选择。 在...

    NX二次开发UF-CURVE-LINE-ARC-is-arc-equal 函数介绍

    NX二次开发UF_CURVE_LINE_ARC__is_arc_equal 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域...

    arc-theme, 具有透明元素的平面主题.zip

    arc-theme, 具有透明元素的平面主题 arc-主题微软的arc 3和 GNOME 2的透明元素,支持 GTK 3和 GNOME shell,支持基于GTK的桌面环境,如 GNOME,Unity,Budgie,万神庙,Xfce,MATE等等。 arc-可用三种变体 arc

    PyPI 官网下载 | ARC-Alkali-Rydberg-Calculator-2.1.2.tar.gz

    《PyPI官网下载 | ARC-Alkali-Rydberg-Calculator-2.1.2.tar.gz》 本资源是PyPI(Python Package Index)官方提供的一个软件包,名为"ARC-Alkali-Rydberg-Calculator",版本号为2.1.2,其以.tar.gz的压缩格式提供。...

    arc-engine9.3最完整许可文件License

    arc-engine9.3最完整许可文件License,其中包括了最完整控件(map,sence等)的许可,没有时间限制,完全破解,是AE开发者必备文件!

    中英文转ARC2码编码软件

    这款"中英文转ARC2码编码软件"是专为处理中英文字符而设计的工具,旨在帮助用户将中英文文本转换成ARC2编码格式,以便在单片机程序中使用。 首先,我们要理解编码的基本概念。在计算机世界中,字符(如中英文)需要...

    arc-rimi.rar_linux arc

    标题中的“arc-rimi.rar_linux arc”表明这是一个与Linux操作系统下的ARCnet网络驱动程序相关的压缩文件,特别是针对“RIM I”(完全内存映射)卡片的驱动。ARCnet是一种古老的局域网(LAN)技术,最初在1980年代...

    arc-grey-theme, 具有透明元素中性版本的平面主题.zip

    arc-grey-theme, 具有透明元素中性版本的平面主题 arc-灰色主题美国大陆的arc 3和基于 GTK 2的Gnome 3 。Unity 。Pantheon 。XFCE 。Mate等桌面环境都有一个平面的主题。 下载链接 arc-灰色有三种变体 arc 灰色弧线...

Global site tag (gtag.js) - Google Analytics