二维码及二维码接合短URL的应用

  • 二维码

      1.什么是二维码?

                二维条形码,最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理。它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化等特点

     2.分类

        1).堆叠式

         堆叠式/行排式二维条码(又称堆积式二维条码或层排式二维条码),其编码原理是建立在一维条码基础之上,按需要堆积成二行或多行。它在编码设计、校验原理、识读方式等方面继承了一维条码的一些特点,识读设备与条码印刷与一维条码技术兼容。但由于行数的增加,需要对行进行判定,其译码算法与软件也不完全相同于一维条码。有代表性的行排式二维条码有:Code
16K、Code 49、PDF417等。

       2).矩阵式

      短阵式二维条码(又称棋盘式二维条码)它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。矩阵式二维条码是建立在计算机图像处理技术、组合编码原理等基础上的一种新型图形符号自动识读处理码制。具有代表性的矩阵式二维条码有:Code
One、Maxi Code、QR Code、 Data Matrix等

   3.应用

  二维条码具有储存量大、保密性高、追踪性高、抗损性强、备援性大、成本便宜等特性,这些特性特别适用于表单、安全保密、追踪、证照、存货盘点、资料备援等方面。

表单应用:公文表单、商业表单、进出口报单、舱单等资料之传送交换,减少人工重覆输入表单资料,避免人为错误,降低人力成本。
保密应用:商业情报、经济情报、政治情报、军事情报、私人情报等机密资料之加密及传递。
追踪应用:公文自动追踪、生产线零件自动追踪、客户服务自动追踪、邮购运送自动追踪、维修记录自动追踪、危险物品自动追踪、後勤补给自动追踪、医疗体检自动追踪、生态研究(动物、鸟类...)自动追踪等。
证照应用:护照、身份证、挂号证、驾照、会员证、识别证、连锁店会员证等证照之资料登记及自动输入,发挥「随到随读」、「立即取用」的资讯管理效果
4.二维码常用格式
   网址 (URL),电子邮箱地址(E-mail Address),电话号码 (telephone numbers),联系方式 (Contact information:vcard,MECARD,BIZCARD),短信(SMS),彩信 (MMS),地理位置 (Geographic information),获取安卓软件,获取Wifi配置(Android)等
二.接合短Url
   1.什么是短Url?
     短地址(也叫 短网址:Short
URL)就是为了让一个很长的网站链接缩短为一个短的链接,因为微博内有字数限制,所以短地址就是为了这个而产生的。现在大部分微博、 手机邮件提醒等地方已经有很多应用模式了,并占据了一定的市场。估计很多朋友现在也正在使用
   算法原理
现在的短地址网站基本都是通过ASP或者PHP转向来实现网址缩短。
 2.算法一
1)将长网址md5生成32位签名串,分为4段, 每段8个 字节;
2)对这四段循环处理, 取8个 字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;
3)这30位分成6段, 每5位的数字作为字母表的索引取得特定 字符, 依次进行获得6位字符串;
4)总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址;
3.算法二
a-z,A-Z,0-9,这62位取6位组合,可产生500多亿个组合数量。把数字和字符组合做一定的映射,就可以产生唯一的字符串,如第62个组合就是aaaaa9,第63个组合就是aaaaba,再利用洗牌算法,把原字符串打乱后保存,那么对应位置的组合字符串就会是无序的组合。
把长网址存入数据库,取返回的id,找出对应的字符串,例如返回ID为1,那么对应上面的字符串组合就是bbb,同理 ID为2时,字符串组合为bba,依次类推,直至到达64种组合后才会出现重复的可能,所以如果用上面的62个字符,任意取6个字符组合成字符串的话,你的数据存量达到500多亿后才会出现重复的可能。
4.二维条码为什么要接合短Url
   要生成二维码,通常要传入不同参数,特别是在生成名片二维码,生成的URL比较长,有时候可能超出浏览器地址栏的限制,所以才统一加成了短URL,这样生成的二维码地址是一个可控地地址:域名+6位字符
5.具体实现
  1)生成格式格式的Url
    public static string getShortUrl(string Data, QrType qrType, string QrHost)
        {
            string UrlData = string.Empty;
            try
            {
                string[] ActStr = { "getUrl", "getMeVcard", "getText" };
                QrHost = (QrHost.LastIndexOf(@"/")+1 == QrHost.Length) ? QrHost : (string.Format("{0}{1}", QrHost, "/"));
                UrlData = getEncryptData(Data);
                UrlData = UrlHelper.GetShortUrl(string.Format("{0}Qr/{1}?Content={2}", QrHost, ActStr[(int)qrType], UrlData));
                UrlData = string.Format("{0}{1}", QrHost, UrlData);
            }
            catch (Exception e) { UrlData = string.IsNullOrEmpty(QrHost)?"请配置QrHost":e.Message; }
            return UrlData;
        }

 2.生成二维码图片的MemoryStream

  /// <summary>
        /// MeVcard名片二维码
        /// </summary>
        /// <param name="Info">MeVcard</param>
        /// <returns></returns>
        public MemoryStream CreateMeVcard(MeVcardInfo Info)
        {
            if (Info == null ) return null; 
            Content = "MECARD:";
            SpVcardLink("N", Info.Name);
            SpVcardLink("TEL", Info.Tel);
            SpVcardLink("TEL", Info.Tel2);
            SpVcardLink("EMAIL", Info.Email);
            SpVcardLink("ADR", Info.Address);
            SpVcardLink("URL", Info.Url);
            SpVcardLink("NOTE", Info.Note);
            SpVcardLink("BDAY", Info.Birthday);
            SpVcardLink("PHONE", Info.Phone);
            SpVcardLink("FAX", Info.FAX);
            Content = (Content == "MECARD:" ? "" : Content);
            return CreateText(Content);
        }

3.解析短URL,还原实际地址

 

  public void Index(string url)
        {try
            {
                if (url.Length == 6)
                {
                    string Locahost = Request.Url.AbsoluteUri.Replace(url, "");
                    using (var client = YIZNoSql.RedisManager.GetPConClient())
                    {
                        url = client.Get<string>(url);
                    }

                    string Content = string.Empty;
                    Action<string> Act = getText;
                    string Acttext = string.Format("{0}qr/{1}?content=", Locahost, "gettext");
                    string Acturl = string.Format("{0}qr/{1}?content=", Locahost, "geturl");
                    string Actmevcard = string.Format("{0}qr/{1}?content=", Locahost, "getmevcard");
                    if (url.IndexOf(Acturl, StringComparison.CurrentCultureIgnoreCase) == 0)
                    {
                        Content = url.Substring(Acturl.Length, url.Length - Acturl.Length);
                        Act = getUrl;
                    }
                    else if (url.IndexOf(Actmevcard, StringComparison.CurrentCultureIgnoreCase) == 0)
                    {
                        Content = url.Substring(Actmevcard.Length, url.Length - Actmevcard.Length);
                        Act = getMeVcard;
                    }
                    else
                    {
                        Content = url.Substring(Acttext.Length, url.Length - Acttext.Length);
                        Act = getText;
                    }
                    Act(Content);
                }
                else
                {
                    Response.Write("Error!!");
                }
            }
            catch { Response.Write("Parse Error!!"); }
        }

4.输出图片

  

/// <summary>
        /// 二维码名片
        /// </summary>
        private void getMeVcard(string Content)
        {
            QrCodeHelper qc = new QrCodeHelper();
            MeVcardInfo Info = JsonConvert.DeserializeObject<MeVcardInfo>(Helper.getDecryptData(Content));
            MemoryStream ms = qc.CreateMeVcard(Info);
            WriteImg(ms);
        }
 private void WriteImg(MemoryStream Ms)
        {
            try
            {
                Response.Clear();
                Response.ContentType = "image/png";
                Response.OutputStream.Write(Ms.GetBuffer(), 0, (int)Ms.Length);
            }
            catch
            {
            }
        }

 

 

转载于:https://www.cnblogs.com/gzalrj/p/3342331.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值