ما النص المقابل لـ48 65 6C 6C 6F؟
Hello في ASCII وUTF-8: 48 هو H، و65 هو e، و6C هو l، و6F هو o.
تحويل Hex إلى نص والنص إلى Hex. الصق Hex بأي شكل — مفصولاً بمسافات، أو 0x، أو \x، أو مخرجات xxd أو hexdump، أو مصفوفات بايتات Java أو C — ليُكتشف ASCII أو UTF-8 أو GBK أو UTF-16 تلقائياً. يعمل في متصفحك.
قُرئ الإدخال بصيغة hex مجرد · 13 بايت
Hello, 世界
الكشف التلقائي: UTF-8، فكل تسلسل متعدد البايتات سليم البنية.
الناتج نفسه hex — ربما حُوِّل مرتين. جولة إضافية تعطي:
| الترميز | القراءة |
|---|---|
| UTF-8 يُفكّ ترميزه بسلامة | Hello, 世界 |
| GBK / GB18030 يُفكّ ترميزه بسلامة | Hello, 涓栫晫 |
| UTF-16LE فيه بايتات يتعذّر فك ترميزها | 效汬Ɐ隸闧� |
| UTF-16BE فيه بايتات يتعذّر فك ترميزها | 䡥汬漬⃤뢖� |
| ISO-8859-1 يُفكّ ترميزه بسلامة | Hello, ä¸<96>ç<95><8C> |
48 65 6C 6C 6F 2C 20 E4 B8 96 E7 95 8C
كتبه وراجعه مطوّرون يبنون أدوات الترميز في Go Tools. كل قيمة hex وكل ناتج مذكور في هذه الصفحة يُنتجه محرّك الصفحة نفسها وتتحقق منه اختبارات آلية.
Hello في ASCII وUTF-8: 48 هو H، و65 هو e، و6C هو l، و6F هو o.
عادةً 3 بايتات في UTF-8، و2 في GBK فالمحرف 你 هو E4 BD A0 في UTF-8، وC4 E3 في GBK.
CR LF (\r\n) إرجاع العربة متبوعاً بتغذية السطر (\r\n)، وهي نهاية السطر التي تستخدمها Windows وHTTP ومعظم مجموعات الأوامر التسلسلية.
41 أما الحرف الصغير a فهو 61؛ ويختلف الشكلان الكبير والصغير دائماً بمقدار 20.
النظام الست عشري (hex) طريقة لكتابة البايتات: يُكتب كل بايت، من 0 إلى 255، بخانتين من 00 إلى FF. ويعيد تحويل hex إلى نص هذه البايتات إلى نص مقروء، وهو ينطوي دائماً على اختيار ترميز المحارف — الجدول الذي يحدد أي بايت، أو أي تسلسل بايتات، يمثّل أي محرف.
في النص الإنجليزي نادراً ما يظهر أثر هذا الاختيار، لأن ASCII وUTF-8 وGBK ومعظم الترميزات الأخرى تتفق على البايتات من 00 إلى 7F. لكنه يظهر فوراً مع أي شيء آخر. فالبايتات C4 E3 BA C3 هي 你好 في GBK وغير صالحة في UTF-8، بينما 你好 في UTF-8 هي E4 BD A0 E5 A5 BD. فقيمة hex لا تحمل إلا نصف المعلومة؛ والترميز هو النصف الآخر.
أما تحويل النص إلى hex فهو العملية المعاكسة: رمّز النص إلى بايتات، ثم اكتب كل بايت بخانتين ست عشريتين. ويستخدمه المطوّرون لرؤية ما يمر بالضبط عبر خط تسلسلي أو ما يُكتب في عمود قاعدة بيانات، ولإدراج بيانات ثنائية في الكود المصدري، وللمقارنة بين ما أرسله نظامان فعلياً.
$ echo 48656c6c6f | xxd -r -p
Hello
>>> bytes.fromhex('c4e3bac3').decode('gbk')
'你好'
>>> bytes.fromhex('c4e3bac3').decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte مفصولاً بمسافات أو متصلاً أو بنقطتين رأسيتين أو بشرطات، وقيم 0x، وتسلسلات هروب \x، وترميز %، ومصفوفات C وGo وJava، ومخرجات Arrays.toString ذات الإشارة في Java، وقيم bytes الحرفية في Python، وكائنات Buffer في Node.js، وشاشات xxd وhexdump -C وod الكاملة. وتخبرك الصفحة بما تعرّفت عليه وما حذفته.
يفحص الكشف التلقائي وجود علامة ترتيب البايتات، ثم UTF-8 سليم البنية، ثم UTF-16، ثم ASCII خالص، ثم GBK، ويذكر القاعدة التي حسمت الأمر. ولا يُختار GBK إلا إذا قُرئت البايتات محارف صينية شائعة، لذا تُوصَف الإطارات الثنائية القصيرة بأنها على الأرجح ليست نصاً بدلاً من عرضها محارف صينية لا معنى لها.
تُعرض البايتات نفسها بترميزات UTF-8 وGBK وUTF-16LE وUTF-16BE وISO-8859-1، مع بيان ما إذا كان فك ترميز كل منها سليماً أم لا. وحين يخرج النص مشوّهاً، تكون القراءة الصحيحة عادةً في الصف التالي.
تُعرض NUL وCR وLF وESC وغيرها من بايتات التحكم بالشكل ␀ ␍ ␊ ␛، فيبرز 00 زائد في النهاية أو 0D مفقود في بيانات البروتوكول. ويظل النسخ يعطي المحارف الحقيقية.
يكتب تبويب «نص ← Hex» قيم hex مفصولة بمسافات أو متصلة، وقوائم 0x، وتسلسلات هروب \x، ومصفوفة C بأسلوب xxd -i، وbyte[] في Java بقيم ذات إشارة، وقيمة bytes حرفية في Python مطابقة لناتج repr()، و[]byte في Go، أو تفريغ xxd — وتستطيع الصفحة قراءة كل منها من جديد.
يجري التحليل وفك الترميز محلياً بلغة JavaScript. لا يُرفع شيء ولا يُخزَّن ولا يوضع في عنوان URL، لذا يمكنك لصق التقاطات الحزم وسجلات بيئة الإنتاج بأمان.
bytes.fromhex(h).decode() تُعيد bytes.fromhex('48 65 6c 6c 6f').decode('utf-8') القيمة 'Hello'؛ والمسافات بين البايتات مسموحة، أما البادئة 0x فلا. والعكس هو s.encode('utf-8').hex()، أو .hex(' ') لناتج مفصول بمسافات. ومرّر 'gbk' لفك ترميز النص الصيني أو ترميزه بـGBK.
Buffer.from(h, 'hex') Buffer.from(h, 'hex').toString('utf8') تفك الترميز، وBuffer.from(s, 'utf8').toString('hex') ترمّز. الإدخال غير الصالح لا يُعدّ خطأً: يتوقف فك الترميز عند أول زوج سيئ وتُسقط الخانة الفردية الزائدة في النهاية، لذا تحقّق من الإدخال أولاً.
TextDecoder / TextEncoder حلّل الأزواج بـparseInt(pair, 16) إلى Uint8Array، ثم استخدم new TextDecoder('utf-8').decode(bytes). يقرأ TextDecoder أيضاً 'gbk' و'big5' و'shift_jis'، لكن TextEncoder لا يُنتج إلا UTF-8.
HexFormat.of() new String(HexFormat.of().parseHex(h), StandardCharsets.UTF_8) تفك الترميز وHexFormat.of().formatHex(s.getBytes(StandardCharsets.UTF_8)) ترمّز. وفي الإصدارات الأقدم نسّق كل بايت بـString.format("%02x", b)؛ وتجنّب Integer.toHexString(b)، التي تطبع ffffffe4 للبايتات السالبة.
encoding/hex تُعيد hex.DecodeString(h) البايتات، وتحوّلها string(b) إلى سلسلة نصية؛ وhex.EncodeToString([]byte(s)) تعمل في الاتجاه المعاكس. والحزمة صارمة: المسافات تُعيد invalid byte: U+0020 ' '، والطول الفردي يُعيد odd length hex string.
sscanf with %2hhx مرّ على السلسلة خانتين في كل مرة إلى مخزن مؤقت من نوع unsigned char وأضف محرف الإنهاء '\0'. ولطباعة hex، حوّل النوع إلى unsigned char واستخدم %02X، وإلا فقد تُطبع البايتات الأكبر من 0x7F بالشكل FFFFFFE4 حيث يكون char ذا إشارة.
hex2bin() / bin2hex() تُعيد hex2bin('48656c6c6f') القيمة Hello، وتُعيد bin2hex('Hello') القيمة 48656c6c6f. ويوثّق الدليل أن hex2bin() تُعيد false مع E_WARNING عند الإدخال ذي الطول الفردي أو غير الصالح.
xxd -r -p / xxd -p يطبع echo 48656c6c6f | xxd -r -p الكلمة Hello، ويطبع printf 'Hello' | xxd -p القيمة 48656c6c6f. واستخدم printf بدلاً من echo عند الترميز، لأن echo يضيف سطراً جديداً في النهاية، أي 0a.
Convert.FromHexString() Encoding.UTF8.GetString(Convert.FromHexString(h)) تفك الترميز وConvert.ToHexString(Encoding.UTF8.GetBytes(s)) ترمّز (بأحرف كبيرة ومن دون فواصل). وترفض FromHexString المسافات والبادئة 0x. ولا يتضمّن .NET Core ولا .NET 5+ ترميز GBK: استدعِ Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) أولاً، ثم Encoding.GetEncoding(936).
48 65 6C 6C 6F 2C 20 E4 B8 96 E7 95 8C
Hello, 世界
البايتات السبعة الأولى ASCII عادية: 48 65 6C 6C 6F هي Hello، و2C فاصلة، و20 مسافة. أما E4 B8 96 وE7 95 8C فتسلسلان من ثلاثة بايتات في UTF-8 يمثّلان 世 و界 — إذ يشغل معظم المحارف الصينية ثلاثة بايتات في UTF-8. ولأن كل تسلسل سليم البنية، يقرؤه الكشف التلقائي على أنه UTF-8.
CE C2 B6 C8 3A 32 35 2E 33 A1 E6
温度:25.3℃
كثير من الأجهزة التسلسلية ترسل النص الصيني بترميز GBK. هنا CE C2 هو 温 وB6 C8 هو 度، و3A 32 35 2E 33 هو :25.3 بترميز ASCII، وA1 E6 هو رمز ℃ كامل العرض — بايتان لكل محرف صيني أو رمز. فإذا قُرئت البايتات على أنها UTF-8 فهي غير صالحة (CE يبدأ تسلسلاً من بايتين، لكن C2 ليس بايت استمرار)، وإذا قُرئت على أنها GBK فهي محارف شائعة، لذا يختار الكشف التلقائي GBK. والمحوّل الذي لا يعرف سوى UTF-8 يعرض هنا محارف استبدال.
00000000: 4869 20e4 bda0 e5a5 bd0d 0a Hi ........
Hi 你好␍␊
هذا بالضبط ما يطبعه printf 'Hi 你好\r\n' | xxd. تُحذف الإزاحة 00000000: وعمود المحارف على اليمين قبل فك الترميز؛ ولو قُرئا على أنهما بيانات، لتحوّلت الأصفار الثمانية وحدها إلى أربعة بايتات NUL في البداية. والبايتان الأخيران، 0d 0a، فاصل أسطر بنمط Windows، ويظهران بالشكل ␍␊.
[-28, -72, -83, -26, -106, -121]
中文
تطبع Arrays.toString(bytes) بايتات Java ذات الإشارة بالنظام العشري. والقيم السالبة هي البايتات من 0x80 فما فوق: -28 تساوي 256 − 28 = 228 = 0xE4. والبايتات الستة E4 B8 AD E6 96 87 هي ترميز UTF-8 للكلمة 中文.
AT+CSQ\r\n
41 54 2B 43 53 51 0D 0A
تتوقع أجهزة المودم ومعظم مجموعات أوامر UART أن ينتهي كل أمر بإرجاع العربة متبوعاً بتغذية السطر. لكن مربع النص لا يُنتج عند الضغط على Enter سوى 0A، لذا حدّد فواصل الأسطر بصيغة CR LF فتصبح نهاية السطر 0D 0A.
653462646130653561356264
e4bda0e5a5bd → 你好
كل بايت هنا خانة ست عشرية بترميز ASCII (65 هو e، و34 هو 4، و62 هو b)، لذا ينتج فك الترميز الأول سلسلة hex أخرى. ويحدث هذا حين تُعامَل سلسلة hex على أنها نص فتُحوَّل مرة ثانية. وتعرض الصفحة جولة ثانية تعطي 你好. ولتجنّب الإنذارات الكاذبة لا تعرضها إلا إذا كانت النتيجة الأولى 12 خانة ست عشرية على الأقل وكان فك الترميز الثاني يعطي نصاً حقيقياً — فالتواريخ والطوابع الزمنية وقيم CRC32 وقيم تجزئة MD5 لا تستدعيها.
الصقه في مربع الإدخال في تبويب «Hex ← نص» بأي شكل لديك: مفصولاً بمسافات، أو متصلاً، أو قيم 0x، أو تسلسلات هروب \x، أو مصفوفة بايتات، أو شاشة xxd كاملة. ويوضح السطر أسفل المربع كيف قُرئ.
يظهر النص في مربع الناتج، مع الترميز المكتشف تلقائياً وسبب اختياره. فإن كان التخمين خاطئاً، يعرض الجدول أدناه كل القراءات؛ فاختر الصحيحة من قائمة «الترميز».
تُعرض بايتات التحكم مثل NUL وCR وLF بالشكل ␀ ␍ ␊. ألغِ تحديد «إظهار المحارف غير المرئية» لرؤية النص المجرد، ثم انسخ النتيجة.
في تبويب «نص ← Hex»، اختر الترميز وصيغة الإخراج — hex مفصول بمسافات، أو قيم 0x، أو مصفوفة C أو Java أو Python أو Go، أو تفريغ xxd. وحدّد CR LF لبروتوكولات المنافذ التسلسلية والشبكات.
النص الصيني الصادر عن برمجيات Windows القديمة وكثير من الأجهزة التسلسلية وقواعد البيانات القديمة يكون بترميز GBK. وفك ترميزه على أنه UTF-8 إما أن يفشل وإما أن يملأ الناتج بمحارف الاستبدال. انظر إلى جدول الترميزات واستخدم القراءة المفهومة.
>>> bytes.fromhex('c4e3bac3').decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte >>> bytes.fromhex('c4e3bac3').decode('gbk')
'你好' تُعيد charCodeAt() وحدة ترميز UTF-16. وفي ASCII تتطابق مصادفةً مع البايت، لذا لا يظهر الخطأ إلا مع المحارف الأخرى، حيث لا تكون النتيجة ما يرسله أي نظام UTF-8.
'你'.charCodeAt(0).toString(16) // '4f60' — a UTF-16 code unit
Buffer.from('你', 'utf8').toString('hex') // 'e4bda0' — the UTF-8 bytes النوع byte في Java ذو إشارة، لذا تكون البايتات من 0x80 فما فوق سالبة. وتعمل Integer.toHexString() على قيمة int، فتطبع القيم السالبة بصيغة hex غير ذات إشارة بطول 32 بت، وتُسقط الأصفار البادئة.
Integer.toHexString(b) // "ffffffe4" for 0xE4, "a" for 0x0A
String.format("%02x", b) // "e4", "0a" لا ترمي Buffer.from(hex, 'hex') أي خطأ أبداً. بل تتوقف عند أول زوج ليس hex صالحاً وتتجاهل خانة فردية زائدة في النهاية، فيعطيك الخطأ المطبعي Buffer أقصر بدلاً من رسالة خطأ.
Buffer.from('486', 'hex') // <Buffer 48> — the 6 is silently dropped
Buffer.from('48zz65', 'hex') // <Buffer 48> — stops at zz if (!/^([0-9a-f]{2})*$/i.test(hex)) throw new Error('invalid hex');
Buffer.from(hex, 'hex'); المحوّل الذي يكتفي بحذف المسافات يقرأ الإزاحة 00000000: على أنها بيانات، ويقرأ عمود المحارف على أنه مزيد من hex حيثما استطاع. فتبدأ النتيجة ببايتات NUL وتنحرف من هناك. استخدم xxd -p للحصول على hex مجرد، أو الصق التفريغ هنا حيث يُتعرَّف على الأعمدة.
00000000: 4869 20e4 bda0 e5a5 bd0d 0a Hi ........ → read naively: 00 00 00 00 48 69 20 e4 …
$ printf 'Hi 你好\r\n' | xxd -p 486920e4bda0e5a5bd0d0a
تُنهي أجهزة مودم AT وكثير من البروتوكولات القائمة على الأسطر كل أمر بإرجاع العربة متبوعاً بتغذية السطر. والأمر الذي ينتهي بـ0A وحده كثيراً ما يُتجاهَل دون أي خطأ على الإطلاق.
41 54 2B 43 53 51 0A AT+CSQ followed by LF only
41 54 2B 43 53 51 0D 0A AT+CSQ followed by CR LF
0D 0A أو 00 في نهايته — واعمل في الاتجاه المعاكس لبناء أمر بنهايات أسطر CR LF يقبله الجهاز.b'...'، وNode.js بالشكل <Buffer ...>. الصق مقطع السجل كما هو لترى النص، بما في ذلك ما إذا كان UTF-8 أو GBK.00 إلى FF، ويكون عدد البايتات دائماً نصف عدد الخانات. والأحرف الكبيرة والصغيرة بالمعنى نفسه. أما الفواصل والبادئات وصياغة المصفوفات فمجرد طريقة كتابة: 4865 و48 65 و0x48, 0x65 و\x48\x65 هي البايتان نفساهما.00 إلى 7F. تمتد المحارف القابلة للطباعة من 20 (المسافة) إلى 7E (~)؛ والباقي محارف تحكم، أكثرها ظهوراً في البيانات الحقيقية 00 (NUL) و09 (الجدولة) و0A (تغذية السطر) و0D (إرجاع العربة) و1B (الهروب). وتحافظ UTF-8 وGBK وISO-8859-1 كلها على هذه القيم، ولهذا ينجو النص الإنجليزي العادي من أي ترميز خاطئ تقريباً.C2 إلى DF لبايتين، ومن E0 إلى EF لثلاثة، ومن F0 إلى F4 لأربعة — ويجب أن يقع كل بايت يليه بين 80 وBF. وهذه البنية الصارمة هي سبب أن الجملة المكتوبة بـGBK لا تكون UTF-8 صالحاً في شبه كل الحالات — ففي اختبارنا على 33,910 جملة صينية، كانت 55 منها كذلك — وسبب ثقة الكشف التلقائي بفك ترميز UTF-8 السليم. أما المحرف الصيني المنفرد فمختلف: نحو 18% من محارف GBK تُشكّل مصادفةً تسلسل UTF-8 صالحاً من بايتين.81 إلى FE يليه بايت لاحق من 40 إلى FE، باستثناء 7F. ولأن نطاق البايت اللاحق واسع جداً، فإن نص UTF-8 القصير إذا قُرئ على أنه GBK كثيراً ما يُفكّ ترميزه دون أي خطأ إلى محارف لا علاقة لها به — فيصبح E4 BD A0 E5 A5 BD (你好) 浣犲ソ — ولهذا تجرّب هذه الصفحة UTF-8 أولاً. ويوسّع GB18030 ترميز GBK بتسلسلات من أربعة بايتات للمحارف الأندر؛ ويقبلها فك الترميز هنا.41 00 — ويضع UTF-16BE البايت الأعلى أولاً — 00 41. وتستخدم واجهات Windows البرمجية وكثير من الملفات ترتيب little-endian، وقد تبدأ بعلامة ترتيب البايتات FF FE؛ أما ملفات UTF-8 فتبدأ أحياناً بـEF BB BF. ويحذف الكشف التلقائي علامة ترتيب البايتات ويُبلغ عنها.getBytes()، أو encode()، أو إعداد طرفية تسلسلية، أو مجموعة محارف اتصال قاعدة البيانات — اضبط الترميز صراحةً ودوّنه بجوار hex، كي لا يضطر الطرف الآخر إلى التخمين.charCodeAt() في JavaScript أو قيم char في Java، تعطي وحدات ترميز UTF-16 لا بايتات مرمّزة. رمّز السلسلة النصية أولاً بـTextEncoder أو Buffer.from() أو getBytes(StandardCharsets.UTF_8)، ثم نسّق البايتات.%02x أو ما يعادله، ولا تكتفِ أبداً باستدعاء مجرد لتحويل عدد إلى hex. تبدو a و0a متشابهتين في السجل، لكن ضمّ قيم غير مكمّلة يُنتج سلسلة ذات طول فردي، أو ما هو أسوأ: سلسلة يُفكّ ترميزها إلى بايتات مختلفة.00 إلى FF، فتكون 48656c6c6f هي البايتات الخمسة 48, 65, 6C, 6C, 6F. ثانياً، فُكّ ترميز هذه البايتات بترميز محارف. ففي ASCII وUTF-8 يمثّل 48 الحرف H، و65 الحرف e، و6C الحرف l، و6F الحرف o، فتنتج Hello. وفي الخطوة الثانية تختلف النتائج: فالبايتات الأكبر من 7F تعني محارف مختلفة في UTF-8 وGBK وغيرهما من الترميزات، ولهذا تكشف هذه الصفحة الترميز وتعرض كل القراءات جنباً إلى جنب. C4 E3 BA C3 هو 你好 في GBK لكنه UTF-8 غير صالح، وE4 BD A0 E5 A5 BD هو 你好 في UTF-8 لكنه يتحوّل إلى 浣犲ソ إذا قُرئ على أنه GBK. انظر إلى جدول الترميزات أسفل النتيجة — فالصف الذي يُقرأ نصاً مفهوماً هو الترميز الذي كُتبت به البيانات. ومع محرف واحد أو محرفين لا يستطيع الكشف التلقائي الحسم دائماً: D2 BB هو UTF-8 صالح (һ) وGBK صالح أيضاً (一)، لذا راجع سطر GBK الذي تعرضه الصفحة أسفل النتيجة. وهناك سببان آخران يستحقان الاستبعاد: خانة ست عشرية زائدة أو ناقصة، تُزيح كل بايت يليها بمقدار نصف بايت، ولصق تفريغ ست عشري ما زال عمود الإزاحة ملتصقاً به. وإذا كان ما بين يديك نصاً مشوّهاً أصلاً (مثل 浣犲ソ) لا hex، فالصق النص في أداة تحويل الترميز بدلاً من ذلك. E4 BD A0 E5 A5 BD، بالشكل 浣犲ソ. أو قد يحتوي النص على بايتات تحكم مثل 00 أو 0D 0A تظهر مربعاتٍ أو فواصل أسطر. الصق hex هنا: يعرض جدول الترميزات قراءتَي UTF-8 وGBK جنباً إلى جنب، وتظهر بايتات التحكم بالشكل ␀ ␍ ␊. 00 إلى 7F: الحروف والأرقام وعلامات الترقيم ومحارف التحكم. وقد صُمّم UTF-8 بحيث تعني هذه البايتات نفسها المحارف ذاتها تماماً، ويستخدم تسلسلات من البايتات بدءاً من 80 فما فوق لكل ما عدا ذلك — 2 بايت للحروف اللاتينية ذات العلامات، و3 لمعظم المحارف الصينية واليابانية والكورية، و4 للرموز التعبيرية. لذا يعطي تحويل hex إلى ASCII وتحويله إلى UTF-8 نتائج متطابقة للنص الإنجليزي العادي. ويختلفان بمجرد أن يكون أحد البايتات 80 أو أكبر: فالمحوّل المقتصر على ASCII لا يستطيع عرض هذه البايتات محارفَ، بينما يفك UTF-8 ترميزها إلى نطاق يونيكود الكامل. ولمعرفة ما يمثّله كل بايت من 00 إلى 7F، راجع جدول ASCII. E4 BD A0. وفي GBK وGB2312 تشغل 2 بايت: 你 هو C4 E3. وفي UTF-16 تشغل محارف المستوى متعدد اللغات الأساسي 2 بايت، ويهمّ ترتيب البايتات: 你 هو 60 4F في UTF-16LE و4F 60 في UTF-16BE. أما المحارف النادرة خارج هذا المستوى فتشغل 4 بايتات في UTF-8، و4 في UTF-16 (زوج بديل)، و4 في GB18030. غيّر الترميز في تبويب «نص ← Hex» لترى عدد البايتات لنصك أنت. bytes.fromhex() ثم فُكّ الترميز: bytes.fromhex('48656c6c6f').decode('utf-8') تُعيد 'Hello'. تقبل fromhex المسافات بين البايتات، فتعمل bytes.fromhex('48 65 6c 6c 6f') أيضاً، لكنها ترفض البادئة 0x وترمي ValueError. ولبيانات GBK فُكّ الترميز بـ'gbk': bytes.fromhex('c4e3bac3').decode('gbk') تُعيد '你好'، بينما يرمي فك ترميز البايتات نفسها بوصفها UTF-8 الخطأ UnicodeDecodeError. والعكس هو '你好'.encode('utf-8').hex()، التي تُعيد 'e4bda0e5a5bd'؛ ومرّر فاصلاً مثل .hex(' ') للحصول على ناتج مفصول بمسافات. Buffer.from('48656c6c6f', 'hex').toString('utf8') القيمة 'Hello'. وانتبه للإدخال الخاطئ: لا يرمي Node أي خطأ — بل يتوقف عند أول زوج غير صالح ويُسقط بصمت خانة فردية زائدة في النهاية، فيكون Buffer.from('486', 'hex') مخزناً مؤقتاً من بايت واحد. وفي المتصفح، أنشئ البايتات بنفسك واستخدم TextDecoder، الذي يقرأ GBK أيضاً: new TextDecoder('gbk').decode(Uint8Array.from('c4e3bac3'.match(/../g), h => parseInt(h, 16))) تُعيد '你好'. ولا تستخدم charCodeAt() للحصول على البايتات: '你'.charCodeAt(0).toString(16) تساوي '4f60'، وهي وحدة ترميز UTF-16 وليست بايتات UTF-8 التي هي e4bda0. unsigned char، ثم أنهِ السلسلة: for (size_t i = 0; i < n; i++) sscanf(hex + 2 * i, "%2hhx", &buf[i]); buf[n] = '\0'; حيث n تساوي strlen(hex) / 2. وعندما تكون hex هي 48656c6c6f2c20e4b896e7958c، تُطبع buf على طرفية UTF-8 بالشكل Hello, 世界. وللاتجاه المعاكس اطبع كل بايت بـprintf("%02X ", (unsigned char)s[i]). والتحويل الصريح للنوع مهم: ففي المنصات التي يكون فيها char ذا إشارة، سيُمدَّد بايت مثل 0xE4 بالإشارة ويُطبع FFFFFFE4 لولا هذا التحويل. وفي C++ ألحِق كل زوج بالسلسلة عبر s.push_back(static_cast<char>(std::stoi(hex.substr(i, 2), nullptr, 16)))؛ ومع قيمة hex نفسها تكون النتيجة Hello, 世界. new String(HexFormat.of().parseHex(hex), StandardCharsets.UTF_8)؛ ولبيانات GBK استخدم Charset.forName("GBK") بدلاً من ذلك. أما في الاتجاه المعاكس فالمفاجأة المعهودة هي ffffffe4، لأن النوع byte في Java ذو إشارة، ولأن Integer.toHexString() تأخذ قيمة من نوع int. يُخزَّن البايت 0xE4 بالقيمة -28؛ وتوسيعه إلى int يُبقي القيمة -28، وtoHexString تطبع الأعداد السالبة بقيمتها غير ذات الإشارة بطول 32 بت، أي ffffffe4. كما تُسقط الدالة نفسها الأصفار البادئة، فيخرج 0x0A بالشكل a. استخدم String.format("%02x", b)، التي تنسّق البايت السالب بقيمته غير ذات الإشارة بطول 8 بتات، أو Integer.toHexString(b & 0xff) مع الإكمال بالأصفار. وفي Java 17 وما بعده، تحوّل HexFormat.of().formatHex(bytes) مصفوفة كاملة، وتعيدها HexFormat.of().parseHex(hex) إلى أصلها. hex2bin() ترميز سلسلة hex إلى سلسلة ثنائية، وbin2hex() تعمل في الاتجاه المعاكس: bin2hex('Hello') تُعيد 48656c6c6f. ووفقاً لدليل PHP، تُعيد hex2bin() القيمة false وتُطلق E_WARNING حين يكون طول الإدخال فردياً أو لا يكون ست عشرياً صالحاً، لذا احذف المسافات وبادئات 0x قبل استدعائها. سلاسل PHP بايتات، لذا تحمل النتيجة الترميز الذي استخدمه النص الأصلي أياً كان — حوّل ناتج GBK بـmb_convert_encoding() إذا كانت صفحتك بترميز UTF-8. xxd (بما في ذلك -u و-c و-g)، وhexdump -C، وhex.Dump في Go، وod -A x -t x1، وod -t x1z من GNU، وتوسّع سطر * الذي يطبعه hexdump وod بدلاً من الصفوف المكررة. كما تتعامل مع hexdump المجرد وod -x، اللذين يطبعان كلمات بطول 16 بت بدلاً من البايتات: فعلى جهاز بترتيب little-endian تُطبع البايتات 48 69 بالشكل 6948، لذا تعيد الصفحة كل زوج إلى ترتيبه وتستخدم الإزاحة الأخيرة لحذف بايت الحشو المضاف إلى البيانات ذات الطول الفردي. وقد اختُبر كل شكل من أشكال xxd وhexdump وod على 600 تفريغ حقيقي لبيانات عشوائية. a بدلاً من 0a)، أو محرف اقتُطع عند النسخ، أو حرف دخيل مثل O مكان 0. وسلسلة hex الناتجة عن تحويل كل البايتات كعدد واحد كبير، مثل hex(int.from_bytes(data, 'big')) في Python، تفقد الصفر في بدايتها: فيخرج \r\n بالشكل 0xd0a. ولا تخمّن الصفحة أي خانة مفقودة، لأن التخمين الخاطئ يُزيح كل بايت بعدها بمقدار نصف بايت وينتج هراءً مقنعاً. بل تعرض إصلاحين بنقرة واحدة — إضافة 0 في البداية، أو حذف الخانة الأخيرة — لتقارن بين النتيجتين. أما القيم المكتوبة كلٌّ على حدة مع بادئة، مثل 0x0 0xa، فلا مشكلة فيها: إذ تُقرأ كل واحدة منها بايتاً كاملاً. الترميز والتنسيق
جدول ASCII الكامل: 128 حرفًا بالأنظمة العشري والست عشري والثماني والثنائي، مع محوّل ثنائي الاتجاه بين النص وشيفرات ASCII. أحرف التحكم مرفقة بتسلسلات الهروب وتدوين ^ وأين تصادفها فعليًا.
الترميز والتنسيق
رمّز وفك ترميز Base64 مجاناً أونلاين — محوّل فوري مع دعم UTF-8 والرموز التعبيرية. خصوصية 100% — يعمل في متصفّحك. جرّبه الآن.
الترميز والتنسيق
فك ترميز سلسلة Base64 أو عنوان URI للبيانات إلى صورة داخل متصفّحك. عاين واقرأ الأبعاد ونوع MIME ثم نزّل كـ PNG أو JPG أو GIF أو SVG. بلا رفع.
الترميز والتنسيق
حوّل CSV إلى JSON في متصفحك. RFC 4180، استنتاج الأنواع، صف العنوان، أمان الأعداد الكبيرة. خصوصية 100%.
الترميز والتنسيق
الصق نصاً مشوّهاً واسترجع أصله. تُجرَّب كل سلسلة ترميز محتملة — UTF-8 وGBK وBig5 وShift_JIS وEUC-KR وWindows-1252 — وتُرتَّب النتائج مع بيان السلسلة وراء كل واحدة. مجاني ويعمل كلياً داخل متصفحك.
الترميز والتنسيق
الصق ملف .env واحصل على JSON فورًا. كلمات مرور قاعدة بياناتك ومفاتيح API لا تغادر متصفحك أبدًا — خاص 100٪، بلا رفع، محلّل dotenv مجاني.