精华内容
下载资源
问答
  • 哈夫曼编码长度计算问题

    万次阅读 2018-01-02 13:55:20
    问题是: 已知某字符串S中共有8种字符,各种字符分别出现2次、1次、4次、5次、7次...也就是2×5+1×5+4×3+5×3+7×2+3×4+4×3+9×2=98,所以该字符串的编码长度至少是98位。 这个就是带权路径长度,因为出现的次数

    问题是:
    已知某字符串S中共有8种字符,各种字符分别出现2次、1次、4次、5次、7次、3次、4次和9次,对该字符串进行哈夫曼,问该字符串的编码至少有多少位?

    我们首先构造一个哈夫曼树:
    这里写图片描述
    其中编码位数就是出现 次数×编码位(bit)
    也就是2×5+1×5+4×3+5×3+7×2+3×4+4×3+9×2=98,所以该字符串的编码长度至少是98位。
    这个就是带权路径长度,因为出现的次数就是权重,编码位数就是节点到根节点的层数。

    展开全文
  • [size=large][color=blue]想在页面上计算字节长度,因为太长后面就不能插入数据库了,所以特别纠结,咋样限制用户的...[size=large][b][color=red]关键字:怎么用js,javascript 计算UTF-8编码字符串占用的字节长度...
    [size=large][color=blue]想在页面上计算下字节长度,因为太长后面就不能插入数据库了,所以特别纠结,咋样限制用户的输入呢? 研究了很久,最后搞了个比较满意的计算方法。
    这里是用来计算UTF-8编码占用的字节长度。[/color][/size]
    [size=large][b][color=red]关键字:怎么用js,javascript 计算UTF-8编码字符串占用的字节长度。[/color][/b][/size]

    function getStrLeng(str) {
    var realLength = 0;
    var len = str.length;
    var charCode = -1;
    for (var i = 0; i < len; i++) {
    charCode = str.charCodeAt(i);
    if (charCode >= 0 && charCode <= 128) {
    realLength += 1;
    } else {
    if (charCode < 2048) {
    realLength += 2;
    } else {
    if (charCode < 65536) {
    realLength += 3;
    } else {
    //这里偷懒了,其他全部算6字节了。计算中英文,这个计算方法应该是够用了。
    realLength += 6;
    }

    }
    }
    }
    return realLength;
    }
    展开全文
  • Base64如何编码长度计算公式. Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),数据不足3字节,用0补足; 因为6位二进制数可以表示64个不同的数,因此只要确定了字符集(含64个字符),并...

    Base64简介

    它实际上是一种“二进制到文本”的编码方法,它能够将给定的任意二进制数据(纯文本当然更没问题)映射为64个ASCII字符组成的字符串的形式,以便在只支持文本的环境中也能够顺利地传输二进制数据。
    Base64要求把每三个8Bit的字节转换为四个6Bit的字节(38 = 46 = 24),数据不足3字节,用0补足;
    因为6位二进制数可以表示64个不同的数,因此只要确定了字符集(含64个字符),并为其中的每个字符确定一个唯一的编码,就可以通过正向与反向映射将二进制字节转换为Base64编码或反之。

    编码后的长度如何确定呢

    为了保存结果,更合理的分配大小存储,有时候需要确定编码输出后的长度。
    从原理来看,转换后的字符串理论上将要比原来的长大约1/3。
    更精确的计算公式:(两种情况)

    nsrcSize 整型表示原数据的字节数,nrsltSize 整型表示编码后的长度,字节数

    1. 如果不加换行符,一般情况:
    	int nrsltSize = ceil(nsrcSize/3.0)*4;  //不足3字节需要补全。使用math.h的ceil(),除数要为小数
    
    	int nrsltSize = (nsrcSize + 2)/3*4;    //更巧妙。充分利用整数相除截断,给予偏移
    
    1. 如果按照RFC 822规定,输出编码每76个字符,加上一个换行符\n:
    	int nrsltSize = (nsrcSize + 2)/3*4 + (nsrcSize-1)/57;   //输出76字符对应原串57字符,58字符就要长度加1
    

    分享下C++实现源码

    size_t base64_encode(const char *bytes_to_encode,
        size_t bytes_len, char *encode_bytes, size_t buf_len /* = 0 */)
    {
        static const unsigned char s_BASE64[]
            = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
        size_t i=0; // 待编码字符索引
        size_t j=0; // 已编码字符索引
        // 输入参数错误,返回0
        if (0 == bytes_to_encode
            || bytes_len < 1
            || 0 == encode_bytes
            || (buf_len != 0 
                 && ((bytes_len+2)/3*4 + (bytes_len+56)/57) > buf_len))
        {
            return 0;
        }
        // 编码,按3位一组,不足一组后续特殊处理
        for (i=0, j=0; i+2<bytes_len; i += 3)
        {
            // 编码,按3位一组,转成4位一组
            encode_bytes[j++] = s_BASE64[(bytes_to_encode[i] & 0xfc) >> 2];
            encode_bytes[j++] = s_BASE64[((bytes_to_encode[i] & 0x03) << 4)
                + ((bytes_to_encode[i+1] & 0xf0) >> 4)];
            encode_bytes[j++] = s_BASE64[((bytes_to_encode[i+1] & 0x0f) << 2)
                + ((bytes_to_encode[i+2] & 0xc0) >> 6)];
            encode_bytes[j++] = s_BASE64[bytes_to_encode[i+2] & 0x3f];
    
            // 每76个字符,增加一个换行符(是否加换行符并不影响编码解码,视情况开启,注意对编码后长度的影响)
            // if (i+3 < bytes_len && 0 == (j+1)%77)
            // {
            //     encode_bytes[j++] = '\n';
            // }
        }
        // 剩余数据,1或2位
        if (i != bytes_len)
        {
            // 编码第1位,正常编码
            encode_bytes[j++] = s_BASE64[(bytes_to_encode[i] & 0xfc) >> 2];
            // 编码第2、3位,根据剩余数据不同,编码方式不同
            if (i+1 == bytes_len)   // 剩余1位数据
            {
                encode_bytes[j++] = s_BASE64[((bytes_to_encode[i] & 0x03) << 4)];
                encode_bytes[j++] = '=';    // 第3位补等号
            }
            else                    // 剩余2位数据
            {
                encode_bytes[j++] = s_BASE64[((bytes_to_encode[i] & 0x03) << 4)
                    + ((bytes_to_encode[i+1] & 0xf0) >> 4)];
                encode_bytes[j++] = s_BASE64[((bytes_to_encode[i+1] & 0x0f) << 2)];
            }
            // 第4位,需要补等号
            encode_bytes[j++] = '=';
        }
        // 返回编码后的数据长度
        return j;
    }
    

    拿几十M的文件测试了下,计算速度还是蛮快的,1s左右。


    myAvatar

    展开全文
  • 英文字母和中文汉字在不同字符编码下的字节数英文字母:字节数 : 1;编码:GB2312字节数 : 1;编码:GBK字节数 : 1;编码:GB18030字节数 : 1;编码:ISO-8859-1字节数 : 1;编码:UTF-8字节数 : 4;编码:UTF-16字节数 ...

    英文字母和中文汉字在不同字符集编码下的字节数

    英文字母:

    • 字节数 : 1;编码:GB2312
    • 字节数 : 1;编码:GBK
    • 字节数 : 1;编码:GB18030
    • 字节数 : 1;编码:ISO-8859-1
    • 字节数 : 1;编码:UTF-8
    • 字节数 : 4;编码:UTF-16
    • 字节数 : 2;编码:UTF-16BE
    • 字节数 : 2;编码:UTF-16LE

    中文汉字:

    • 字节数 : 2;编码:GB2312
    • 字节数 : 2;编码:GBK
    • 字节数 : 2;编码:GB18030
    • 字节数 : 1;编码:ISO-8859-1
    • 字节数 : 3;编码:UTF-8
    • 字节数 : 4;编码:UTF-16
    • 字节数 : 2;编码:UTF-16BE
    • 字节数 : 2;编码:UTF-16LE
    这是个好问题,可以当作一个笔试题。先从字符编码讲起。 
    1. 美国人首先对其英文字符进行了编码,也就是最早的ascii码,用一个字节的低7位来表示英文的128个字符,高1位统一为0;
    2. 后来欧洲人发现尼玛你这128位哪够用,比如我高贵的法国人字母上面的还有注音符,这个怎么区分,得,把高1位编进来吧,这样欧洲普遍使用一个全字节进行编码,最多可表示256位。欧美人就是喜欢直来直去,字符少,编码用得位数少;
    3. 但是即使位数少,不同国家地区用不同的字符编码,虽然0--127表示的符号是一样的,但是128--255这一段的解释完全乱套了,即使2进制完全一样,表示的字符完全不一样,比如135在法语,希伯来语,俄语编码中完全是不同的符号;
    4. 更麻烦的是,尼玛这电脑高科技传到中国后,中国人发现我们有10万多个汉字,你们欧美这256字塞牙缝都不够。于是就发明了GB2312这些汉字编码,典型的用2个字节来表示绝大部分的常用汉字,最多可以表示65536个汉字字符,这样就不难理解有些汉字你在新华字典里查得到,但是电脑上如果不处理一下你是显示不出来的了吧。
    5. 这下各用各的字符集编码,这世界咋统一?俄国人发封email给中国人,两边字符集编码不同,尼玛显示都是乱码啊。为了统一,于是就发明了unicode,将世界上所有的符号都纳入其中,每一个符号都给予一个独一无二的编码,现在unicode可以容纳100多万个符号,每个符号的编码都不一样,这下可统一了,所有语言都可以互通,一个网页页面里可以同时显示各国文字。
    6. 然而,unicode虽然统一了全世界字符的二进制编码,但没有规定如何存储啊,亲。x86和amd体系结构的电脑小端序和大端序都分不清,别提计算机如何识别到底是unicode还是acsii了。如果Unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,文本文件的大小会因此大出二三倍,这对于存储来说是极大的浪费。这样导致一个后果:出现了Unicode的多种存储方式。
    7. 互联网的兴起,网页上要显示各种字符,必须统一啊,亲。utf-8就是Unicode最重要的实现方式之一。另外还有utf-16utf-32等。UTF-8不是固定字长编码的,而是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。这是种比较巧妙的设计,如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。
    8. 注意unicode的字符编码和utf-8的存储编码表示是不同的,例如"严"字的Unicode码是4E25,UTF-8编码是E4B8A5,这个7里面解释了的,UTF-8编码不仅考虑了编码,还考虑了存储,E4B8A5是在存储识别编码的基础上塞进了4E25。
    9. UTF-8 使用一至四个字节为每个字符编码。128 个 ASCII 字符(Unicode 范围由 U+0000 至 U+007F)只需一个字节,带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语希伯来文阿拉伯文、叙利亚文及马尔代夫语(Unicode 范围由 U+0080 至 U+07FF)需要二个字节,其他基本多文种平面(BMP)中的字符(CJK属于此类-Qieqie注)使用三个字节,其他 Unicode 辅助平面的字符使用四字节编码。
    10. 最后,要回答你的问题,常规来看,中文汉字在utf-8中到底占几个字节,一般是3个字节,最常见的编码方式是1110xxxx 10xxxxxx 10xxxxxx。

    展开全文
  • 前言 在一些业务场景下,我们会将文件或图片转化为Base64编码进制传输,而业务中有需要对文件的大小进行限制,如何在不进行解码的...如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本...
  • base64编码长度计算

    万次阅读 2016-03-28 22:40:28
    先看一个来自牛客网的题目在网络传输数据时,经常需要将二进制数据转换为一个可打印字符串。一般用到的可打印字符集合包含64个字符,因此又称为Base64...16,28base64的编码都是按字符长度,以每3个8bit的字符为一组,
  • 编码格式 和 长度计算

    千次阅读 2018-08-13 18:28:47
    字符串的结束符 在C语言中没有专门的字符串变量,通常用...有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。   Unicode编码 Unicode码内容:它前128个字符就是ASCII码,之后是扩展码。 ASC...
  • Base64编码长度计算

    2021-07-25 11:56:29
    Base64的编码都是按字符长度,以每3个8bit的字符为一组, 然后针对每组,首先获取每个字符的ASCII编码,然后把ASCII编码转换成8bit二进制,得到24bit; 再把这24bit每六个划分,高位用0补齐,得到4个8bit的字节, ...
  • 开发过程需要校验前台输入的字符串长度,以保证传到后台的字符串长度不超过数据库字段的...// UTF8字符集实际长度计算 function getStrLeng(str){ var realLength = 0; var len = str.length; var charCode = -...
  • UTF编码字符串的总字节计算

    千次阅读 2016-11-09 16:52:45
    UTF编码字符串的总字节计算
  • (一)“字节”的定义 字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位。 ...(二)“字符”的定义 ...字符是指计算机中使用的文字和符号,...不同编码里,字符和字
  • 赫夫曼编码长度计算问题?

    千次阅读 2016-12-04 02:37:51
    网上例题:一组字符(a,b,c,d)在文中出现的次数分别为(7,6,3,5),字符'd'的哈夫曼编码长度为? 题解: 首先构造huffman树 每一步都将所有数字排序 方法如下: 1: 3 5 6 7 2: 6 7 8 / \ 3 5 3: 8 13 / \ / \ 3 5 6 7...
  • 但此函数只能算出字符的个数无法计算字符串的长度,例如 'ABC你好'用此函数计算得到的值为5,显然它不是我们想要的,它的字节长度为7 。  经过研究,我写了一个函数可以实现功能代码如下: FUNCTION YGET_CNCHAR_...
  • 再谈日文编码字符显示长度计算

    千次阅读 2007-11-12 11:49:00
    将某个日文字符显示出来,无外乎就是去判断是半角还是全角字符,半角的占用一个字节的位置,全角的占用两个字节的位置。最初的想法就是直接根据getBytes("UTF-8").length来判断。结果经过仔细的测试,发现有一小部分...
  • C--中文汉字占用字节长度字符集和字符编码

    千次阅读 多人点赞 2019-01-21 21:59:17
    中文汉字占用字节长度一、字符集和字符编码1、概念2、英文字母和中文汉字在不同字符编码下的字节数二、环境对应的字符编码1、Ubuntu16.04虚拟机2、Notepad++三、sizeof运算汉字占用字节长度参考 一、字符集和字符...
  • 在做前端验证表单时,有时候要检测一个字符串的字节长度,保证其字节长度不超过数据库表中对应字段允许的最大长度。  不废话,上方法  1.我们通常遇到的情况都是中文+英文,所以可以判断每个字符的 Unicode 编码...
  • 下面的函数都是用于计算字符长度,英文算一个,中文算两个。效果一样,效率却未必一样,大家可以自行选择下。 先看看一下两段代码吧,它们分别用for循环和正则表达式来检测字符串的字节长度:  for循环检测...
  • * 按字节计算字符长度 * @param bytes 字节数 * @returns */ String.prototype.byteLength = function(){ var len = 0; for ( var i = 0; i &lt; this.length; i++) { //UTF8编码一个中文按3个字节算...
  • 计算字符长度

    2019-06-04 21:56:00
    stringstrTmp="abcdefg某某某"; inti=System.Text.Encoding.Default.GetBytes(strTmp).Length;...意义是:按系统编码字节为单位计算长度;在计算机系统编码中,英文字母每位占一个字节,而汉字占两...
  • 1.在开始之前先简单介绍下字符字节的区别: - 字符 人们使用的记号,抽象意义上的一个符号。一个汉字和英文就是一个字符,如'1', '中', 'a', '$', '¥',…… - 字节 计算机中存储数据的单元,一个8位的二进制...
  • 字符长度计算函数

    2017-06-20 13:42:00
    // 字符长度计算函数 $str1 = 'abc';$str2 = '你好吗'; echo strlen($str1); // 输出3echo strlen($str2); // 输出9 // 由于该页面为UTF-8编码,所以,一个中文按三个字节计算,故$str2的长度为9 echo mb_...
  • 下面简要的剖析一下PHP对中文字符长度的处理: PHP自带的函数如strlen()、mb_strlen()都是通过计算字符串所占字节数来统计字符长度的,一个英文字符占1字节。例: $enStr = ‘Hello,China!’; echo strlen($...
  • 为 String扩展原型方法byteLength(),该方法将根据每个字符编码,判断当前字符是单字节还是双字节,然后统计字符串的字节长度。 String.prototype.byteLength...255) {//字符编码大于255,说明是双字节字符 length..
  • 1315.字符编码 Time Limit: 1000 MS Memory Limit: 65536 K Total Submissions: 317 (89 users) Accepted: 100 (83 users) [ My Solution ] Description 在网络通信传输过程中,需要用到编码技术...
  • 博客上的文章深度参差不齐,本人也是看了好几篇博客才找到另自己满意的博客。 1、限制规则 字段的限制在字段定义的时候有以下规则: ...字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766; 字符类型...
  • /* 统一按照GBK格式计算字符长度 */ int astrlen_gbk(const char *str) { const char *p_ch = NULL; int len = 0; int byte = 0; if (!str) return 0; p_ch = str; while (*p_ch) { if (*p_ch & 0x80) { char ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 213,986
精华内容 85,594
关键字:

编码字节长度计算