أفضل طريقة لإخراج اثنين من القلاع من بايت في جافا سكريبت؟
-
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
).
نظرًا لأنني أفضّل هذا ، أردت إضافة بعض الأشياء التي كتبتها للتو والتي قد تكون مفيدة. ربما سيجدها الآخرون مفيدًا أيضًا.
النماذج الأولية:
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