<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; JS Шестнадцатеричное представление строки]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=8506&amp;type=atom" />
	<updated>2013-07-28T05:16:12Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=8506</id>
		<entry>
			<title type="html"><![CDATA[Re: JS Шестнадцатеричное представление строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=74057#p74057" />
			<content type="html"><![CDATA[<p>Нет, с юникодом никаких проблем нет. У нас тут UCS-2 (и UTF-16), т. е. два байта. А про управляющие символы забыл. Придётся исправить.<br /></p><div class="codebox"><pre><code>((function()
{
   var ofsLen = 10, 
       partLen = 8, 
       outPartBlockLen = (2 + 1 + 2 + 2),
       ofsPads = [&quot;&quot;],
       tailPads = [&quot;&quot;];
       
   for(var i = 1; i &lt;= ofsLen; ++i)
      ofsPads[i] = (new Array(i)).join(&quot;0&quot;);
      
   for(var i = 1; i &lt;= partLen; ++i)
      tailPads[i] = (new Array(i * outPartBlockLen)).join(&quot; &quot;);
      
   function string_dumpHex_bytes(out, str)
   {
      for(var j = 0, charCode, ccb0, ccb1; j &lt; str.length; ++j)
      {
         charCode = str.charCodeAt(j);
         ccb0 = (charCode &amp; 0xff).toString(16);
         ccb1 = ((charCode &gt;&gt; 8) &amp; 0xff).toString(16);
            
         if(ccb1.length == 1) { out.push(&quot;0&quot;); } // (charCode &amp; 0xf000) == 0
         out.push( ccb1, &quot; &quot; ); 
            
         if(ccb0.length == 1) { out.push(&quot;0&quot;); } // (charCode &amp; 0xf0) == 0
         out.push( ccb0, &quot;  &quot; );
      }
   };

   function string_dumpHex_offset(out, offset)
   {
      var offs = offset.toString(16);
      out.push(ofsPads[ofsLen - offs.length], offs, &quot;:   &quot;);
   };

   var __escape_char_map = 
   {
      &quot;\b&quot;: &quot;\\b&quot;,
      &quot;\t&quot;: &quot;\\t&quot;,
      &quot;\n&quot;: &quot;\\n&quot;,
      &quot;\f&quot;: &quot;\\f&quot;,
      &quot;\r&quot;: &quot;\\r&quot;,
      &quot;\&quot;&quot;: &quot;\\\&quot;&quot;,
      &quot;\\&quot;: &quot;\\\\&quot;,
      &quot;\&#039;&quot;: &quot;\\\&#039;&quot;,
      &quot;\0&quot;: &quot;\\0&quot;
   };

   function string_dumpHex_escape(out, str)
   {
      for(var i = 0, ch, charCode; i &lt; str.length; ++i)
      {
         ch = str.charAt(i);
         
         if((charCode = ch.charCodeAt(0)) &lt;= 0x1f)
         {
            if(ch in __escape_char_map)
            {
               out.push(__escape_char_map[ch]);
            }
            else
            {
               ch = charCode.toString(16);
               out.push( &quot;\\x&quot; );
               if(ch.length == 1) { out.push(&quot;0&quot;); } // (charCode &amp; 0xf0) == 0
               out.push(ch);
            }
         }
         else
         {
            out.push(ch);
         }
      }
   };
   
   function string_dumpHex_split(str)
   {
      if(!str.length)
         return [&quot;&quot;];
               
      var out = [];
         
      if(str.length &gt; partLen)
      {
         for(var i = 0, ii = ((str.length/partLen)|0)*partLen; i &lt; ii; i += partLen)
            out.push(str.substr(i,partLen));
                  
         if(str.length%partLen &gt; 0)  
            out.push(str.substr(str.length - (str.length%partLen))); 
      }
      else
      {
         out.push(str);
      }
      
      return out;
   };

   String.prototype.dumpHex = function string_dumpHex()
   {
      var parts = string_dumpHex_split(this);
      var tail = parts.pop();
      
      var offset = 0, out = [];
      
      for(var i = 0; i &lt; parts.length; ++i)
      {
         string_dumpHex_offset(out, offset);
         offset += partLen;
         string_dumpHex_bytes(out, parts[i]);
         
         out.push(&quot;  &quot;);
         string_dumpHex_escape(out, parts[i]);
         out.push(&quot;\n&quot;);
      }
      
      string_dumpHex_offset(out, offset);
      string_dumpHex_bytes(out, tail);
         
      if(tail.length &lt; partLen)
         out.push(tailPads[partLen - tail.length], &quot; &quot;);  
         
      out.push(&quot;  &quot;);
      string_dumpHex_escape(out, tail);
      
      return out.join(&quot;&quot;);
   };
   
})());</code></pre></div><p>И без регэкспов и реплейсов, вот!</p>]]></content>
			<author>
				<name><![CDATA[max7]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=10498</uri>
			</author>
			<updated>2013-07-28T05:16:12Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=74057#p74057</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JS Шестнадцатеричное представление строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=74046#p74046" />
			<content type="html"><![CDATA[<p>С Unicode у всех проблемы. Лучше его не интерпретировать, чем интерпретировать неправильно. </p><p><strong>max7</strong><br />Ваш пример преобразует <em>все</em> символы строки в двухбайтовые коды, что не есть хорошо. Например &quot;0&quot; это &quot;30&quot;, а не &quot;00 30&quot;, как у Вас. </p><p>Кстати есть еще одна общая ошибка - забыли про управляющие символы. Следующий код исправляет эту ошибку:<br /></p><div class="codebox"><pre><code>
(function()
{
    var ofsLen = 10;
    var ofsPad = new Array(10).join(&#039;0&#039;);

    var dumper = function(string)
    {
        return string.replace(/.|\n/g, function($0)
        {
            return &#039; &#039; + (&#039;00&#039; + $0.charCodeAt(0).toString(16)).slice(-2);
        });
    };

    var safer = function(string)
    {
        return string.replace(/[\x00-\x1F]/g, &#039; &#039;);
    };

    String.prototype.dumpHex = function()
    {
        var offset = 0;

        var parts = this.match(/[\s\S]{16}|[\s\S]+/g);

        var tailLen = this.length % 16;
        var tailPart;
        var tailSpace;

        if ( tailLen ) {
            tailPart = parts.pop();
            tailSpace = new Array((16 - tailLen) * 3 + 1).join(&#039; &#039;);
        }

        var result = [];
        for (var i = 0; i &lt; parts.length; i++) {
            var ofs = (ofsPad + offset.toString(16)).slice(-ofsLen);
            offset += 16;

            var orig = parts[i];

            result.push(ofs + &#039;: &#039; + dumper(orig) + &#039;  &#039; + safer(orig));
        }

        if ( tailLen ) {
            result.push(ofs + &#039;: &#039; + dumper(tailPart) + tailSpace + &#039;  &#039; + safer(tailPart));
        }

        return result.join(&#039;\n&#039;);
    };
})();
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2013-07-26T08:21:06Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=74046#p74046</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JS Шестнадцатеричное представление строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=74028#p74028" />
			<content type="html"><![CDATA[<p>Не, некошерно. А как же юникод?<br />Я бы переписал так:<br /></p><div class="codebox"><pre><code>var ofsLen = 10, 
    partLen = 8, 
    outPartBlockLen = (2 + 1 + 2 + 2),
    ofsPads = [&quot;&quot;],
    tailPads = [&quot;&quot;],
    re = (new RegExp(&quot;.{&quot; + partLen.toString(10) + &quot;}|.+&quot;, &quot;g&quot;));
    
for(var i = 1; i &lt;= ofsLen; ++i)
   ofsPads[i] = (new Array(i)).join(&quot;0&quot;);
   
for(var i = 1; i &lt;= partLen; ++i)
   tailPads[i] = (new Array(i * outPartBlockLen)).join(&quot; &quot;);
   
function string_dumpHex_bytes(out, part)
{
   for(var j = 0, charCode, ccb0, ccb1; j &lt; part.length; ++j)
   {
      charCode = part.charCodeAt(j);
      ccb0 = (charCode &amp; 0xff).toString(16);
      ccb1 = ((charCode &gt;&gt; 8) &amp; 0xff).toString(16);
         
      if(ccb1.length == 1) { out.push(&quot;0&quot;); } // (charCode &amp; 0xf000) == 0
      out.push( ccb1, &quot; &quot; ); 
         
      if(ccb0.length == 1) { out.push(&quot;0&quot;); } // (charCode &amp; 0xf0) == 0
      out.push( ccb0, &quot;  &quot; );
   }
};

function string_dumpHex_offset(out, offset)
{
   var offs = offset.toString(16);
   out.push(ofsPads[ofsLen - offs.length], offs, &quot;:   &quot;);
};

String.prototype.dumpHex = function string_dumpHex()
{
   var parts = (this.match(re) || [&quot;&quot;]); //this.split_len(partLen);
   var tail = parts.pop();
   
   var offset = 0, out = [];
   
   for(var i = 0; i &lt; parts.length; ++i)
   {
      string_dumpHex_offset(out, offset);
      offset += partLen;
      string_dumpHex_bytes(out, parts[i]);
      out.push(&quot;  &quot;, parts[i], &quot;\n&quot;);
   }
   
   string_dumpHex_offset(out, offset);
   string_dumpHex_bytes(out, tail);
      
   if(tail.length &lt; partLen)
      out.push(tailPads[partLen - tail.length], &quot; &quot;);  
      
   out.push(&quot;  &quot;, tail);
   
   return out.join(&quot;&quot;);
};</code></pre></div><div class="codebox"><pre><code>alert((&#039;0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz &gt;Вова&lt;&#039;).dumpHex())</code></pre></div>]]></content>
			<author>
				<name><![CDATA[max7]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=10498</uri>
			</author>
			<updated>2013-07-24T22:49:58Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=74028#p74028</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JS Шестнадцатеричное представление строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=74024#p74024" />
			<content type="html"><![CDATA[<p>Хм, интересно.</p>]]></content>
			<author>
				<name><![CDATA[max7]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=10498</uri>
			</author>
			<updated>2013-07-24T20:51:03Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=74024#p74024</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[JS Шестнадцатеричное представление строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=74013#p74013" />
			<content type="html"><![CDATA[<p>Написал по мотивам темы <a href="http://forum.script-coding.com/viewtopic.php?id=8501">JScript Шестнадцатеричное представление файла</a>. </p><p>Краткое описание:<br /></p><div class="quotebox"><blockquote><p><strong>String#dumpHex()</strong><br />Преобразует строковый объект в его шестнадцатеричное представление, которое сгруппировано по 16 символов, разделенных символом перевода строки, и включает в себя смещение каждой группы относительно начала строки, шестнадцатеричное представление группы и оригинал.</p></blockquote></div><p>Исходный код:<br /></p><div class="codebox"><pre><code>
(function()
{
    var ofsLen = 10;
    var ofsPad = new Array(10).join(&#039;0&#039;);

    var dumper = function(string)
    {
        return string.replace(/.|\n/g, function($0)
        {
            return &#039; &#039; + (&#039;00&#039; + $0.charCodeAt(0).toString(16)).slice(-2);
        });
    };

    String.prototype.dumpHex = function()
    {
        var offset = 0;

        var parts = this.match(/.{16}|.+/g);

        var tailLen = this.length % 16;
        var tailPart;
        var tailSpace;

        if ( tailLen ) {
            tailPart = parts.pop();
            tailSpace = new Array((16 - tailLen) * 3 + 1).join(&#039; &#039;);
        }

        var result = [];
        for (var i = 0; i &lt; parts.length; i++) {
            var ofs = (ofsPad + offset.toString(16)).slice(-ofsLen);
            offset += 16;

            var orig = parts[i];

            result.push(ofs + &#039;: &#039; + dumper(orig) + &#039;  &#039; + orig);
        }

        if ( tailLen ) {
            result.push(ofs + &#039;: &#039; + dumper(tailPart) + tailSpace + &#039;  &#039; + tailPart);
        }

        return result.join(&#039;\n&#039;);
    };
})();
</code></pre></div><p>Пример использования:<br /></p><div class="codebox"><pre><code>
var s = &#039;0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz /+=&#039;;

var t = s.dumpHex();

alert(t);
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2013-07-24T18:36:29Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=74013#p74013</id>
		</entry>
</feed>
