أفضل طريقة لإخراج اثنين من القلاع من بايت في جافا سكريبت؟

StackOverflow https://stackoverflow.com/questions/3756880

  •  04-10-2019
  •  | 
  •  

سؤال

أقوم بتحليل ملف ثنائي في JavaScript يقوم بتخزين قطعتين من المعلومات لكل بايت ، واحد لكل حلقة. القيم ، بالطبع ، 0-16 و 0-16.

في جميع الأجزاء الأخرى من تنسيق الملف ، يمثل كل بايت جزء واحد من المعلومات ، لذلك كنت أستخدم ما يلي للحصول على قيم الأرقام التي أحتاجها بنجاح:

var num = str.charCodeAt(0) & 0xFF;

لكنني عالق في محاولة معرفة كيفية الحصول على قيمة 0-16 من الحلقة الأولى ، ونفس الشيء بالنسبة إلى القمة الثانية من شخصية البايت الخاصة بي "str".

صباح الخير دكتور.

هل كانت مفيدة؟

المحلول

var num = str.charCodeAt(0) & 0xFF;
var nibble1 = num & 0xF;
var nibble2 = num >> 4;

نصائح أخرى

يمكنك ان تفعل:

var num = str.charCodeAt(0);
var lower_nibble = (num & 0xF0) >> 4;
var higher_nibble = num & 0x0F;

كيف يعمل؟

لنفترض تمثيل بت num هو abcdwxyz ونريد أن نستخرج abcd كما أعلى حلقة و wxyz كما أقل من الحلوى.

لاستخراج الحلمة السفلية ، نقوم فقط بإخفاء القمامة العليا من خلال bitwise وينجد الرقم مع 0x0F:

a b c d w x y z
              &
0 0 0 0 1 1 1 1
---------------
0 0 0 0 w x y z  = lower nibble.

لاستخراج الحلمة العليا ، نقوم أولاً بإخفاء القمة السفلية بواسطة bitwise anding مع 0xF0 كما:

a b c d w x y z
              &
1 1 1 1 0 0 0 0
---------------
a b c d 0 0 0 0

ثم نقوم بتغيير النتيجة بشكل صحيح 4 مرات للتخلص من الأصفار الزائدة.

سيجعل الوقت الأيمن من البت في متغير واحد قد يفقد الجزء الأيمن من اليمين ويجعل اليسار أكثر بت صفر:

a b c d w x y z 
           >> 1
----------------
0 a b c d w x y

بالمثل ، التحول اليمين في اتجاهين 2 سوف تقدم الأوقات النتيجة في:

a b c d w x y z 
           >> 2
----------------
0 0 a b c d w x

والتحول اليمين في العرض 4 تايمز يعطي:

a b c d w x y z 
           >> 4
----------------
0 0 0 0 a b c d 

كما رأينا بوضوح النتيجة هي المقاومة العليا للبايت (abcd).

نظرًا لأنني أفضّل هذا ، أردت إضافة بعض الأشياء التي كتبتها للتو والتي قد تكون مفيدة. ربما سيجدها الآخرون مفيدًا أيضًا.

أسفل JSFIDDLE

النماذج الأولية:


   Number.prototype.fromCharCode  = function ()   {return String.fromCharCode(this);        };

   String.prototype.byte          = function (val){  var a = new Array();                                                         
                                                     for(var i=(val||0),n=val===0?0:this.length-1; i<=n; i++){
                                                        a.push(this.charCodeAt(i) & 0xFF);
                                                     }
                                                     return a;
                                                  };

   String.prototype.HiNibble      = function (val){
                                                     var b = this.byte(val);
                                                     var a = new Array();
                                                     for(var i=0,n=b.length-1; i<=n; i++){a.push(b[i] >> 4);}
                                                     return a;
                                                  };

   String.prototype.LoNibble      = function (val){
                                                     var b = this.byte(val);
                                                     var a = new Array();
                                                     for(var i=0,n=b.length-1; i<=n; i++){a.push(b[i] & 0xF);}
                                                     return a;
                                                  };



مثال على المكالمات:


   var str   = new String("aB");
   console.log(str.byte());             // [ 97, 66 ]
   console.log(str.HiNibble());         // [ 6, 4 ]
   console.log(str.LoNibble());         // [ 1, 2 ]


   console.log(str.byte(0));            // [ 97 ]
   console.log(str.HiNibble(0));        // [ 6 ]
   console.log(str.LoNibble(0));        // [ 1 ]

   var bar = "c";
   console.log(bar.byte());             // [ 99 ]
   console.log(bar.HiNibble());         // [ 6 ]
   console.log(bar.LoNibble());         // [ 3 ]

   var foobar = (65).fromCharCode();    // from an integer (foobar=="A")
   console.log(foobar.byte());          // [ 65 ]
   console.log(foobar.HiNibble());      // [ 4 ]
   console.log(foobar.LoNibble());      // [ 1 ]



أضافت للتو للحصول على مساعدة محتملة ، ولكن لا يتم استخدامها في ما سبق:


/* Useful function that I modified
   Originally from: http://www.navioo.com/javascript/dhtml/Ascii_to_Hex_and_Hex_to_Ascii_in_JavaScript_1158.html
*/
   function AscHex(x,alg){
      hex         = "0123456789ABCDEF";

      someAscii   = '  !"#$%&\''
                  + '()*+,-./0123456789:;=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\'
                  + ']^_`abcdefghijklmnopqrstuvwxyz{|}';
      r           = "";
      if(alg=="A2H"){
         for(var i=0,n=x.length;i<n;i++){
            let=x.charAt(i);
            pos=someAscii.indexOf(let)+32;
            h16=Math.floor(pos/16);
            h1=pos%16;
            r+=hex.charAt(h16)+hex.charAt(h1);
         }
      }
      if(alg=="H2A"){
         for(var i=0,n=x.length;i<n;i++){
            let1=x.charAt(2*i);
            let2=x.charAt(2*i+1);
            val=hex.indexOf(let1)*16+hex.indexOf(let2);
            r+=someAscii.charAt(val-32);
         }
      }
      return r;
   }

   console.log(AscHex('65','A2H'));                // A
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top