কীভাবে স্ট্রিংকে বাইটারিতে রূপান্তর করবেন


90

আমি কীভাবে জাভাস্ক্রিপ্ট ব্যবহার করে বাইটায়ারে একটি স্ট্রিং রূপান্তর করতে পারি। আউটপুট নীচের সি # কোডের সমতুল্য হওয়া উচিত।

UnicodeEncoding encoding = new UnicodeEncoding();
byte[] bytes = encoding.GetBytes(AnyString);

ইউনিকোডএইনকোডিং হ'ল ইউটিএফ -16 এর লিটল-এন্ডিয়ানেন্স সহ ডিফল্টরূপে।

সম্পাদনা করুন: উপরের সি # কোডটি ব্যবহার করে সার্ভার সাইডে উত্পন্ন একটির সাথে আমার বাইটেরে উত্পন্ন ক্লায়েন্ট সাইডটি মেলাতে হবে।


4
জাভাস্ক্রিপ্ট বিএলওবিগুলির সাথে সহজেই সহজ ব্যবহারের জন্য সবচেয়ে বেশি পরিচিত নয় - আপনি কেবল জেএসএন-এ স্ট্রিংটি পাঠাচ্ছেন না কেন?
মার্ক গ্র্যাভেল

হতে পারে আপনি এখানে একবার দেখে নিতে পারেন ..
ভি

4
একটি জাভাস্ক্রিপ্ট স্ট্রিংটি ইউটিএফ -16, বা আপনি এটি ইতিমধ্যে জানেন?
কেভিন

4
সবার আগে আপনাকে কেন এটি জাভাস্ক্রিপ্টে রূপান্তর করতে হবে?
ব্রেকহিড

17
স্ট্রিংগুলি এনকোড করা হয় না। হ্যাঁ, অভ্যন্তরীণভাবে এগুলি বাইট হিসাবে উপস্থাপিত হয় এবং এগুলির একটি এনকোডিং থাকে তবে এটি স্ক্রিপ্টিং স্তরে মূলত অর্থহীন। স্ট্রিংগুলি অক্ষরের যৌক্তিক সংগ্রহ। একটি অক্ষর এনকোড করার জন্য আপনাকে অবশ্যই একটি এনকোডিং স্কিম অবশ্যই স্পষ্টভাবে বেছে নিতে হবে, যা আপনি প্রতিটি অক্ষর কোডকে এক বা একাধিক বাইটের ক্রম রূপান্তর করতে ব্যবহার করতে পারেন। নীচের এই প্রশ্নের উত্তর হ'ল আবর্জনা, কারণ তারা চরকোডএটি কল করে এবং এর মানটিকে "বাইটস" বলে একটি অ্যারেতে আটকে দেয়। হ্যালো! চারকোডএট 255 এর চেয়ে বেশি মান ফিরিয়ে দিতে পারে, তাই এটি বাইট নয়!
ট্রায়ঙ্কো

উত্তর:


21

সি # এ চলছে running

UnicodeEncoding encoding = new UnicodeEncoding();
byte[] bytes = encoding.GetBytes("Hello");

দিয়ে একটি অ্যারে তৈরি করবে

72,0,101,0,108,0,108,0,111,0

বাইট অ্যারে

এমন একটি চরিত্রের জন্য যা কোডটি 255 এর চেয়ে বেশি এটির মতো দেখতে হবে

বাইট অ্যারে

আপনি যদি জাভাস্ক্রিপ্টে খুব অনুরূপ আচরণ চান তবে আপনি এটি করতে পারেন (ভি 2 হ'ল আরও দৃ solution় সমাধান, মূল সংস্করণটি কেবল 0x00 ~ 0xff এর জন্য কাজ করবে)

var str = "Hello竜";
var bytes = []; // char codes
var bytesv2 = []; // char codes

for (var i = 0; i < str.length; ++i) {
  var code = str.charCodeAt(i);
  
  bytes = bytes.concat([code]);
  
  bytesv2 = bytesv2.concat([code & 0xff, code / 256 >>> 0]);
}

// 72, 101, 108, 108, 111, 31452
console.log('bytes', bytes.join(', '));

// 72, 0, 101, 0, 108, 0, 108, 0, 111, 0, 220, 122
console.log('bytesv2', bytesv2.join(', '));


4
আমি ইতিমধ্যে এটি চেষ্টা করেছি তবে এটি আমাকে উপরের সি # কোডের চেয়ে পৃথক ফলাফল দেয়। এই ক্ষেত্রে সি # কোড আউটপুট বাইট অ্যারেটি হ'ল = 72,0,101,0,108,0,108,0,111,0 আমার উভয়টি মিলানোর দরকার আছে তাই কাজ করছে না।
shas

4
@ আমি পূর্ববর্তীটি কেবল ফায়ারফক্স ৪ এ পরীক্ষা করেছি The আপডেট হওয়া সংস্করণটি ফায়ারফক্স 4, ক্রোম 13 এবং আই 9 তে পরীক্ষা করা হয়েছিল।
ব্রুনোএলএম

40
মনে রাখবেন যে স্ট্রিংটিতে ইউনিকোড অক্ষর থাকলে চারকোডএট (আই)> 255 হবে যা সম্ভবত আপনি চান না।
ব্রুফা

23
হ্যাঁ, এটি ভুল। CharCodeAt একটি বাইট ফেরত দেয় না। "বাইটস" নামক অ্যারেতে 255 এর চেয়ে বেশি কোনও মানকে ঠেলে দেওয়ার কোনও মানে হয় না; খুব বিভ্রান্তিকর এই ফাংশনটি মোটেও এনকোডিং সম্পাদন করে না, এটি কেবল অক্ষরের কোডগুলিকে একটি অ্যারেতে আটকে দেয়।
ট্রায়ঙ্কো

4
আমি বুঝতে পারি না কেন এই উত্তরটি সঠিক হিসাবে চিহ্নিত কারণ এটি কোনও কিছুই এনকোড করে না।
এবি

32

আপনি যদি এমন কোনও সমাধান খুঁজছেন যা নোড.জেজে কাজ করে তবে আপনি এটি ব্যবহার করতে পারেন:

var myBuffer = [];
var str = 'Stack Overflow';
var buffer = new Buffer(str, 'utf16le');
for (var i = 0; i < buffer.length; i++) {
    myBuffer.push(buffer[i]);
}

console.log(myBuffer);

4
এটি নোড.জেএস এর জন্য তবে আমি মনে করি যে প্রশ্নটি একটি ব্রাউজারে কাজ করে এমন একটি সমাধান খুঁজছে। তবুও এটি সঠিকভাবে কাজ করে, এই প্রশ্নের অন্যান্য উত্তরগুলির চেয়ে পৃথক, সুতরাং +1।
ড্যানিয়েল ক্যাসিডি

এটি কাজ করে তবে অনেক সহজ কোডটি হ'ল ফাংশন কনভার্টস্ট্রিং (মাইস্ট্রিং) my আমার মফার = নতুন বাফার (মাইস্ট্রিং, 'utf16le'); কনসোল.লগ (মাইফার); আমারবফারটি ফিরিয়ে দিন; }
ফিলিপ রুতোভিটজ ২

16

আমি মনে করি সি # এবং জাভা সমান বাইট অ্যারে উত্পাদন করে। আপনার যদি অ-এসসিআইআই অক্ষর থাকে তবে অতিরিক্ত 0 যোগ করার পক্ষে এটি যথেষ্ট নয় My আমার উদাহরণে কয়েকটি বিশেষ অক্ষর রয়েছে:

var str = "Hell ö € Ω 𝄞";
var bytes = [];
var charCode;

for (var i = 0; i < str.length; ++i)
{
    charCode = str.charCodeAt(i);
    bytes.push((charCode & 0xFF00) >> 8);
    bytes.push(charCode & 0xFF);
}

alert(bytes.join(' '));
// 0 72 0 101 0 108 0 108 0 32 0 246 0 32 32 172 0 32 3 169 0 32 216 52 221 30

আমি জানি না যে সি # বিওএম রাখে (বাইট অর্ডার মার্কস), তবে যদি ইউটিএফ -16 ব্যবহার করে তবে জাভা String.getBytesনিম্নলিখিত বাইটগুলি যুক্ত করে: 254 255।

String s = "Hell ö € Ω ";
// now add a character outside the BMP (Basic Multilingual Plane)
// we take the violin-symbol (U+1D11E) MUSICAL SYMBOL G CLEF
s += new String(Character.toChars(0x1D11E));
// surrogate codepoints are: d834, dd1e, so one could also write "\ud834\udd1e"

byte[] bytes = s.getBytes("UTF-16");
for (byte aByte : bytes) {
    System.out.print((0xFF & aByte) + " ");
}
// 254 255 0 72 0 101 0 108 0 108 0 32 0 246 0 32 32 172 0 32 3 169 0 32 216 52 221 30

সম্পাদনা করুন:

একটি বিশেষ অক্ষর যুক্ত হয়েছে (U + 1D11E) মিউজিকাল সিম্বল জি সিএলএফ (বিপিএম এর বাইরে, সুতরাং ইউটিএফ -16 এ কেবল 2 বাইট নয়, তবে 4)।

বর্তমান জাভাস্ক্রিপ্ট সংস্করণগুলি অভ্যন্তরীণভাবে "ইউসিএস -২" ব্যবহার করে, সুতরাং এই চিহ্নটি 2 টি সাধারণ অক্ষরের স্থান নেয়।

আমি নিশ্চিত নই তবে charCodeAtএটি ব্যবহার করার সময় মনে হয় আমরা ঠিক ইউটিএফ -১ 16 তেও ব্যবহৃত সার্গেট কোডপয়েন্ট পেয়েছি, সুতরাং বিপিএম-বি অক্ষরগুলি সঠিকভাবে পরিচালনা করা হয়।

এই সমস্যাটি একেবারে অপ্রয়োজনীয়। এটি ব্যবহৃত জাভাস্ক্রিপ্ট সংস্করণ এবং ইঞ্জিনগুলির উপর নির্ভর করে। সুতরাং আপনি যদি নির্ভরযোগ্য সমাধান চান তবে আপনার এক নজর দেওয়া উচিত:


4
এখনও একটি সম্পূর্ণ উত্তর না। ইউটিএফ 16 একটি পরিবর্তনশীল-দৈর্ঘ্যের এনকোডিং যা অক্ষরের প্রতিনিধিত্ব করতে 16-বিট খণ্ড ব্যবহার করে। চার্টার কোডের মানটি কতটা বড় তার উপর নির্ভর করে একটি একক অক্ষর হয় হয় 2 বাইট বা 4 বাইট হিসাবে এনকোড হবে। যেহেতু এই ফাংশনটি সর্বাধিক 2 বাইট লিখেছেন, এটি সমস্ত ইউনিকোড অক্ষর কোড পয়েন্টগুলি পরিচালনা করতে পারে না এবং এটি ইউটিএফ 16 এনকোডিংয়ের সম্পূর্ণ বাস্তবায়ন নয়, দীর্ঘ শট দ্বারা নয়।
ট্রায়ঙ্কো

আমার ত্রয়ীঙ্কো আমার সম্পাদনা ও পরীক্ষার পরেও কি আপনি এখনও ভাবেন যে এটি সম্পূর্ণ উত্তর নয়? যদি হ্যাঁ, আপনার একটি উত্তর আছে?
hgoebl

4
@ ট্রাইঙ্কো আপনি অর্ধেক ঠিক বলেছেন, কিন্তু আসলে এই উত্তরটি সঠিকভাবে কাজ করে। জাভাস্ক্রিপ্ট স্ট্রিংগুলি আসলে ইউনিকোড কোড পয়েন্টগুলির ক্রম নয়, সেগুলি ইউটিএফ -16 কোড ইউনিটের অনুক্রম। নাম সত্ত্বেও charCodeAt0-65535 পরিসরে একটি ইউটিএফ -16 কোড ইউনিট প্রদান করে। 2-বাইট সীমার বাইরের অক্ষরগুলি ইউটিএফ -16 এর মতোই সারোগেট জোড়া হিসাবে উপস্থাপিত হয়। (যাইহোক, জাভা এবং সি # সহ আরও কয়েকটি ভাষায় স্ট্রিংয়ের ক্ষেত্রে এটি সত্য))
ড্যানিয়েল ক্যাসিডি

যাইহোক, (charCode & 0xFF00) >> 8অপ্রয়োজনীয়, স্থানান্তর করার আগে আপনাকে এটি মাস্ক করার দরকার নেই।
প্যাট্রিক রবার্টস

15

2018 এর সবচেয়ে সহজ উপায় টেক্সটইনকোডার হওয়া উচিত তবে ফিরে আসা উপাদানটি বাইট অ্যারে নয়, এটি ইউন্ট 8আরে। (এবং সমস্ত ব্রাউজার এটি সমর্থন করে না)

let utf8Encode = new TextEncoder();
utf8Encode.encode("eee")
> Uint8Array [ 101, 101, 101 ]

এটি অদ্ভুত। আমি মনে করি না যে বিভিন্ন ভেরিয়েবলের নামগুলি utf8 ডেকোড এবং utf8 এনকোড কাজ করবে using
ইউনিহীড্রন

আপনি ব্যবহার করতে পারেন TextDecoder ডিকোড করতে: new TextDecoder().decode(new TextEncoder().encode(str)) == str
Fons

এখানে সমর্থন টেবিলগুলি রয়েছে TextEncoder: ক্যানিউজ
ফনস

11

UTF-16 বাইট অ্যারে

জাভা স্ক্রিপ্টটি সি # এর মতোই ইউটিএফ -16 হিসাবে স্ট্রিংগুলি এনকোড করে UnicodeEncoding, তাই বাইট অ্যারেগুলি ঠিক ব্যবহার করে মিলবে charCodeAt()এবং প্রতিটি ফিরে বাইট জোড়াকে 2 টি পৃথক বাইটে বিভক্ত করা উচিত:

function strToUtf16Bytes(str) {
  const bytes = [];
  for (ii = 0; ii < str.length; ii++) {
    const code = str.charCodeAt(ii); // x00-xFFFF
    bytes.push(code & 255, code >> 8); // low, high
  }
  return bytes;
}

উদাহরণ স্বরূপ:

strToUtf16Bytes('🌵'); 
// [ 60, 216, 53, 223 ]

তবে, আপনি যদি কোনও ইউটিএফ -8 বাইট অ্যারে পেতে চান তবে আপনাকে অবশ্যই বাইটগুলি ট্রান্সকোড করতে হবে।

UTF-8 বাইট অ্যারে

সমাধানটি কিছুটা তুচ্ছ মনে হয়, তবে আমি নীচের কোডটি একটি উচ্চ ট্র্যাফিক উত্পাদন পরিবেশে দুর্দান্ত সাফল্যের সাথে ( মূল উত্স ) ব্যবহার করেছি।

এছাড়াও, আগ্রহী পাঠকের জন্য, আমি আমার ইউনিকোড সহায়কগুলি প্রকাশ করেছি যা আমাকে পিএইচপি এর মতো অন্যান্য ভাষায় রিপোর্ট করা স্ট্রিং দৈর্ঘ্যের সাথে কাজ করতে সহায়তা করে।

/**
 * Convert a string to a unicode byte array
 * @param {string} str
 * @return {Array} of bytes
 */
export function strToUtf8Bytes(str) {
  const utf8 = [];
  for (let ii = 0; ii < str.length; ii++) {
    let charCode = str.charCodeAt(ii);
    if (charCode < 0x80) utf8.push(charCode);
    else if (charCode < 0x800) {
      utf8.push(0xc0 | (charCode >> 6), 0x80 | (charCode & 0x3f));
    } else if (charCode < 0xd800 || charCode >= 0xe000) {
      utf8.push(0xe0 | (charCode >> 12), 0x80 | ((charCode >> 6) & 0x3f), 0x80 | (charCode & 0x3f));
    } else {
      ii++;
      // Surrogate pair:
      // UTF-16 encodes 0x10000-0x10FFFF by subtracting 0x10000 and
      // splitting the 20 bits of 0x0-0xFFFFF into two halves
      charCode = 0x10000 + (((charCode & 0x3ff) << 10) | (str.charCodeAt(ii) & 0x3ff));
      utf8.push(
        0xf0 | (charCode >> 18),
        0x80 | ((charCode >> 12) & 0x3f),
        0x80 | ((charCode >> 6) & 0x3f),
        0x80 | (charCode & 0x3f),
      );
    }
  }
  return utf8;
}

এবং এর বিপরীতটি কি?
simbo1905

আমি বিপরীত ফাংশনটিকে "একটি ইউটিএফ -8 বাইট অ্যারেটিকে স্থানীয় ইউটিএফ -16 স্ট্রিংয়ে রূপান্তর" হিসাবে বর্ণনা করব। আমি কখনই বিপরীত উত্পাদন করিনি। Myc env, আমি একটি অক্ষর সীমার পরিবর্তে একটি বাইট পরিসরের এপিআই আউটপুট পরিবর্তন করে এই কোড সরিয়ে তারপর আমি ব্যবহার runes রেঞ্জ বিশ্লেষণ করতে।
jchook

আমি এই প্রশ্নের এই গ্রহণযোগ্য উত্তর হওয়া উচিত পরামর্শ।
ছেড়ে দিন

10

@ Hgoebl এর উত্তর দ্বারা অনুপ্রাণিত। তার কোডটি ইউটিএফ -16 এর জন্য এবং আমার US-ASCII এর জন্য কিছু দরকার ছিল। সুতরাং এখানে ইউএস-এএসসিআইআই, ইউটিএফ -16, এবং ইউটিএফ -32 coveringেকে আরও একটি সম্পূর্ণ উত্তর দেওয়া আছে।

/**@returns {Array} bytes of US-ASCII*/
function stringToAsciiByteArray(str)
{
    var bytes = [];
   for (var i = 0; i < str.length; ++i)
   {
       var charCode = str.charCodeAt(i);
      if (charCode > 0xFF)  // char > 1 byte since charCodeAt returns the UTF-16 value
      {
          throw new Error('Character ' + String.fromCharCode(charCode) + ' can\'t be represented by a US-ASCII byte.');
      }
       bytes.push(charCode);
   }
    return bytes;
}
/**@returns {Array} bytes of UTF-16 Big Endian without BOM*/
function stringToUtf16ByteArray(str)
{
    var bytes = [];
    //currently the function returns without BOM. Uncomment the next line to change that.
    //bytes.push(254, 255);  //Big Endian Byte Order Marks
   for (var i = 0; i < str.length; ++i)
   {
       var charCode = str.charCodeAt(i);
       //char > 2 bytes is impossible since charCodeAt can only return 2 bytes
       bytes.push((charCode & 0xFF00) >>> 8);  //high byte (might be 0)
       bytes.push(charCode & 0xFF);  //low byte
   }
    return bytes;
}
/**@returns {Array} bytes of UTF-32 Big Endian without BOM*/
function stringToUtf32ByteArray(str)
{
    var bytes = [];
    //currently the function returns without BOM. Uncomment the next line to change that.
    //bytes.push(0, 0, 254, 255);  //Big Endian Byte Order Marks
   for (var i = 0; i < str.length; i+=2)
   {
       var charPoint = str.codePointAt(i);
       //char > 4 bytes is impossible since codePointAt can only return 4 bytes
       bytes.push((charPoint & 0xFF000000) >>> 24);
       bytes.push((charPoint & 0xFF0000) >>> 16);
       bytes.push((charPoint & 0xFF00) >>> 8);
       bytes.push(charPoint & 0xFF);
   }
    return bytes;
}

UTF-8 পরিবর্তনশীল দৈর্ঘ্য এবং অন্তর্ভুক্ত করা হয়নি কারণ আমাকে নিজেই এনকোডিংটি লিখতে হবে। UTF-8 এবং UTF-16 পরিবর্তনশীল দৈর্ঘ্য। ইউটিএফ -8, ইউটিএফ -16, এবং ইউটিএফ -32 এর নামটি ইঙ্গিত করে ন্যূনতম সংখ্যক বিট রয়েছে। যদি কোনও ইউটিএফ -32 বর্ণের একটি 65 পয়েন্টের কোড পয়েন্ট থাকে তবে তার অর্থ 3 টি শীর্ষস্থানীয় 0 রয়েছে। তবে ইউটিএফ -16 এর জন্য একই কোডটিতে কেবল 1 টি শীর্ষস্থানীয় 0 অন্যদিকে ইউএস-এএসসিআইআই প্রস্থ 8-বিট নির্দিষ্ট করা হয়েছে যার অর্থ এটি সরাসরি বাইটে অনুবাদ করা যেতে পারে।

String.prototype.charCodeAtসর্বাধিক 2 বাইট রিটার্ন দেয় এবং ইউটিএফ -16 এর সাথে হুবহু মিলে যায়। তবে ইউটিএফ -32 এর String.prototype.codePointAtজন্য প্রয়োজনীয় যা ইসমাস্ক্রিপ্ট 6 (হারমোনি) প্রস্তাবনার অংশ। যেহেতু চারকোডএট 2 বাইট রিটার্ন দেয় যা ইউএস-এএসসিআইআই প্রতিনিধিত্ব করতে পারে stringToAsciiByteArrayতার চেয়ে বেশি সম্ভাব্য অক্ষর, ফাংশনটি অক্ষরটিকে অর্ধেকে বিভক্ত করার এবং উভয় বা উভয় বাইটের পরিবর্তে এই জাতীয় ক্ষেত্রে ফেলে দেবে।

মনে রাখবেন যে এই উত্তরটি তুচ্ছ নয় কারণ চরিত্রের এনকোডিংটি তুচ্ছ নয়। আপনি কী ধরণের বাইট অ্যারে চান তা নির্ভর করে কোন অক্ষর এনকোডিং আপনি সেই বাইটগুলি উপস্থাপন করতে চান।

জাভাস্ক্রিপ্টটিতে অভ্যন্তরীণভাবে ইউটিএফ -১ or বা ইউসিএস -২ ব্যবহার করার বিকল্প রয়েছে তবে যেহেতু এটির এমন পদ্ধতি রয়েছে যেগুলি ইউটিএফ -১ 16 এর মতো কাজ করে আমি কোনও ব্রাউজার কেন ইউসিএস -২ ব্যবহার করবে তা আমি দেখতে পাই না। এছাড়াও দেখুন: https://mathiasbynens.be/notes/javascript-encoding

হ্যাঁ আমি জানি প্রশ্নটি 4 বছরের পুরনো তবে আমার নিজের জন্য এই উত্তরটি দরকার ছিল।


নোডের বাফার ফলাফলগুলি যেখানে আপনার ফাংশন হিসাবে ফিরে '02'আসবে । কোনটি সঠিক? [ 48, 0, 50, 0 ]stringToUtf16ByteArray[ 0, 48, 0, 50 ]
pkyeck

@ পিকেইক আমার স্ট্রিংটওআউটফ 16 বিটআরয়ের ক্রিয়াকলাপটি বিওএম ছাড়াই ইউটিএফ -16 বিই প্রদান করে। আপনি নোড থেকে যে উদাহরণটি দিয়েছেন তা হল বিওএম ছাড়াই ইউটিএফ -16 এলই। আমি ভেবেছিলাম যে বিগ-এন্ডিয়ান ছোট-এন্ডিয়ানগুলির চেয়ে বেশি স্বাভাবিক তবে ভুল হতে পারে।
SkySpiral7

2

যেহেতু আমি উত্তরটি সম্পর্কে মন্তব্য করতে পারি না, তাই আমি জিন ইজারাইলের উত্তরটি তৈরি করব

var myBuffer = [];
var str = 'Stack Overflow';
var buffer = new Buffer(str, 'utf16le');
for (var i = 0; i < buffer.length; i++) {
    myBuffer.push(buffer[i]);
}

console.log(myBuffer);

এই বলে যে আপনি যদি আপনার ব্রাউজারে নোড.জেএস বাফার ব্যবহার করতে চান তবে আপনি এটি ব্যবহার করতে পারেন।

https://github.com/feross/buffer

সুতরাং, টম স্টিকেলের আপত্তি বৈধ নয়, এবং উত্তরটি অবশ্যই একটি বৈধ উত্তর।


1
String.prototype.encodeHex = function () {
    return this.split('').map(e => e.charCodeAt())
};

String.prototype.decodeHex = function () {    
    return this.map(e => String.fromCharCode(e)).join('')
};

4
আপনি যদি অন্য উত্তরগুলির মধ্যে একটির চেয়ে এই পদ্ধতির কেন চয়ন করতে পারেন তা ব্যাখ্যা করার জন্য কোডটির সাথে কিছু পাঠ্যক্রম সরবরাহ করা যদি সহায়ক হয়।
নাইটওয়েল ৮৮৮

এই পদ্ধতির অন্যদের তুলনায় সহজ তবে একই কাজ, আমি কিছুই লিখিনি যে কারণে।
ফ্যাবিও ম্যাকিয়েল

encodeHexবাইট নয়, ১ 16-বিট সংখ্যার একটি অ্যারে প্রদান করবে।
পাভলো

0

ঘটনাস্থলে আমি যে সর্বোত্তম সমাধানটি নিয়ে এসেছি (সম্ভবত সম্ভবত অশোধিত) তা হ'ল:

String.prototype.getBytes = function() {
    var bytes = [];
    for (var i = 0; i < this.length; i++) {
        var charCode = this.charCodeAt(i);
        var cLen = Math.ceil(Math.log(charCode)/Math.log(256));
        for (var j = 0; j < cLen; j++) {
            bytes.push((charCode << (j*8)) & 0xFF);
        }
    }
    return bytes;
}

যদিও আমি লক্ষ্য করছি এই প্রশ্নটি এখানে এক বছরের বেশি সময় ধরে রয়েছে।


4
এটি সঠিকভাবে কাজ করে না। পরিবর্তনশীল দৈর্ঘ্যের অক্ষর যুক্তিটি ভুল, UTF-16 এ কোনও 8-বিট অক্ষর নেই। নাম সত্ত্বেও, charCodeAtএকটি 16-বিট ইউটিএফ -16 কোড ইউনিট দেয়, যাতে আপনার কোনও পরিবর্তনশীল দৈর্ঘ্যের যুক্তি প্রয়োজন না। আপনি কেবল চারকোডএটি কল করতে পারেন, ফলাফলকে দুটি 8-বিট বাইটে ভাগ করতে পারেন এবং আউটপুট অ্যারেতে স্টাফ করতে পারেন (প্রশ্নটি ইউটিএফ -16 এলএর জন্য জিজ্ঞাসা করার পরে প্রথমে সর্বনিম্ন-অর্ডার বাইট)।
ড্যানিয়েল ক্যাসিডি

0

আমি জানি প্রশ্নটি প্রায় 4 বছরের পুরানো, তবে এটিই আমার সাথে সুচারুভাবে কাজ করেছিল:

String.prototype.encodeHex = function () {
  var bytes = [];
  for (var i = 0; i < this.length; ++i) {
    bytes.push(this.charCodeAt(i));
  }
  return bytes;
};

Array.prototype.decodeHex = function () {    
  var str = [];
  var hex = this.toString().split(',');
  for (var i = 0; i < hex.length; i++) {
    str.push(String.fromCharCode(hex[i]));
  }
  return str.toString().replace(/,/g, "");
};

var str = "Hello World!";
var bytes = str.encodeHex();

alert('The Hexa Code is: '+bytes+' The original string is:  '+bytes.decodeHex());

বা, আপনি যদি কেবল স্ট্রিং দিয়ে কাজ করতে চান এবং কোনও অ্যারে না থেকে আপনি ব্যবহার করতে পারেন:

String.prototype.encodeHex = function () {
  var bytes = [];
  for (var i = 0; i < this.length; ++i) {
    bytes.push(this.charCodeAt(i));
  }
  return bytes.toString();
};

String.prototype.decodeHex = function () {    
  var str = [];
  var hex = this.split(',');
  for (var i = 0; i < hex.length; i++) {
    str.push(String.fromCharCode(hex[i]));
  }
  return str.toString().replace(/,/g, "");
};

var str = "Hello World!";
var bytes = str.encodeHex();

alert('The Hexa Code is: '+bytes+' The original string is:  '+bytes.decodeHex());


4
এই ধরণের কাজ, তবে এটি অত্যন্ত বিভ্রান্তিকর। bytesঅ্যারে ধারণ করে না 'বাইট', এটা 16 বিট সংখ্যা, UTF-16 কোড এককে স্ট্রিং প্রতিনিধিত্ব রয়েছে। এটি প্রায় একই প্রশ্নটি জিজ্ঞাসা করেছিল, তবে সত্যিই কেবল দুর্ঘটনাক্রমে।
ড্যানিয়েল ক্যাসিডি

-1

এখানে একই ফাংশনটি যা @ ব্রুনোএলএম একটি স্ট্রিং প্রোটোটাইপ ফাংশনে রূপান্তরিত করেছে:

String.prototype.getBytes = function () {
  var bytes = [];
  for (var i = 0; i < this.length; ++i) {
    bytes.push(this.charCodeAt(i));
  }
  return bytes;
};

আপনি যদি ফাংশনটিকে এরূপ হিসাবে সংজ্ঞায়িত করেন, তবে আপনি কোনও স্ট্রিংয়ে .getBytes () পদ্ধতিতে কল করতে পারেন:

var str = "Hello World!";
var bytes = str.getBytes();

31
এটি এখনও ভুল, ঠিক যেমন উত্তর উল্লেখ করে। CharCodeAt একটি বাইট ফেরত দেয় না। "বাইটস" নামক অ্যারেতে 255 এর চেয়ে বেশি কোনও মানকে ঠেলে দেওয়ার কোনও মানে হয় না; খুব বিভ্রান্তিকর এই ফাংশনটি মোটেও এনকোডিং সম্পাদন করে না, এটি কেবল অক্ষরের কোডগুলিকে একটি অ্যারেতে আটকে দেয়। ইউটিএফ 16 এনকোডিংটি সম্পাদন করতে আপনাকে চার্টার কোডটি পরীক্ষা করে দেখতে হবে, আপনাকে এটি 2 বাইট বা 4 বাইট (যেহেতু ইউটিএফ 16 একটি পরিবর্তনশীল দৈর্ঘ্যের এনকোডিং রয়েছে) দিয়ে উপস্থাপন করতে হবে কিনা তা স্থির করুন এবং তারপরে প্রতিটি বাইট আলাদাভাবে অ্যারেতে লিখুন।
ট্রিইঙ্কো

8
এছাড়াও, নেটিভ ডেটা টাইপের প্রোটোটাইপটি সংশোধন করা খারাপ অভ্যাস।
অ্যান্ড্রু লন্ডিন

@ অ্যান্ড্রুলুন্ডিন, এটি হস্তক্ষেপ করছে ... কে বলে?
জেরথার


-3

আপনার আন্ডারস্কোর লাগবে না, কেবল অন্তর্নির্মিত মানচিত্রটি ব্যবহার করুন:

var string = 'Hello World!';

document.write(string.split('').map(function(c) { return c.charCodeAt(); }));


4
এটি ইউটিএফ -16 কোড পয়েন্টের ক্রম হিসাবে স্ট্রিংটি উপস্থাপন করে 16-বিট সংখ্যার একটি অ্যারের ফেরত দেয়। ওপি যা চেয়েছিল তা নয়, তবে অন্তত এটি আপনাকে আংশিকভাবে সেখানে পেয়ে যায়।
ড্যানিয়েল ক্যাসিডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.