আপনি কীভাবে বাইট অ্যারে কে হেক্সাডেসিমাল স্ট্রিং এ সি তে রূপান্তর করবেন?


89

আমার আছে:

আমি বাইট অ্যারেটিকে একটি স্ট্রিতে রূপান্তর করতে চাই যাতে আমি প্রিন্টফ ব্যবহার করে স্ট্রিংটি মুদ্রণ করতে পারি:

এবং পান (কলোনগুলি প্রয়োজনীয় নয়):

কোন সাহায্যের ব্যাপকভাবে প্রশংসা হবে।


buf[i]অবশ্যই unsigned charbuf[i] > 127buf_ptr += sprintf(buf_ptr, "%02X", (unsigned char)buf[i]);
কাস্ট করা

উত্তর:


93

আরও সাধারণ উপায় জন্য:

স্ট্রিংয়ের সাথে যুক্ত হতে, কয়েকটি উপায় আপনি এটি করতে পারেন ... আমি সম্ভবত স্ট্রিংয়ের শেষে একটি পয়েন্টার রেখেছি এবং স্প্রিন্টফ ব্যবহার করব। বরাদ্দকৃত জায়গার চেয়ে এটি আরও বড় হয় না তা নিশ্চিত করতে আপনার অ্যারের আকারের উপর নজর রাখতে হবে:


আপনাকে ধন্যবাদ মার্ক - আমার সমস্যাটি কিছুটা জটিল। আমার আসলে এক্স বাইটের দৈর্ঘ্য সহ একটি বাফার রয়েছে। আমি এক্স বাইটগুলির জন্য এটি করার এবং ফলাফল হিসাবে একটি স্ট্রিং থাকার একটি জেনেরিক উপায় খুঁজে পেতে আশা করছিলাম।
স্টিভ ওয়ালশ

প্রদত্ত সংখ্যক বাইটের হ্যান্ডলিংয়ের জন্য কোড যুক্ত করতে সদ্য আপডেট হয়েছে ... এক্স দৈর্ঘ্য ধরে ধরে
চিহ্ন Synaviec

আপনাকে আবার মারক ধন্যবাদ, কিন্তু আমি এই সমস্যার জন্য যে জিনিসটি সবচেয়ে জটিল খুঁজে পেয়েছি তা হ'ল এটি কীভাবে স্ট্রিংয়ে মুদ্রণ করা যায়।
স্টিভ ওয়ালশ

6
printf("%02X", (unsigned char)buf[i]);মূল হিসাবে ব্যবহার করা উচিত স্বাক্ষরযুক্ত চরগুলির জন্য উপচে
পড়ার

4
কেন হবে না printf("%02hhX", buf[i])?
হিন্ট্রন

32

কমপ্লিটডের জন্য, আপনি কোনও ভারী লাইব্রেরি ফাংশন (কোনও স্নারপ্রিন্টফ, কোনও স্ট্রিকাট, এমনকি মেমকিও নাও) কল না করে সহজেই এটি করতে পারেন। এটি দরকারী হতে পারে, আপনি যদি এমন কোনও মাইক্রোকন্ট্রোলার বা ওএস কার্নেল প্রোগ্রামিং করছেন যেখানে libc উপলব্ধ নেই say

আপনি যদি এর জন্য গুগল করেন তবে আশেপাশে তেমন কোনও কোড খুঁজে পাওয়া যায় না ancy সত্যিই এটি স্নিপ্রিন্টফ কল করার চেয়ে বেশি জটিল নয় এবং আরও দ্রুত।

এখানে আরেকটি সংক্ষিপ্ততর সংস্করণ। এটি কেবলমাত্র মধ্যবর্তী সূচী ভেরিয়েবল আই এবং ডুপ্লিকেট করা লাস্ট কেস কোডটি এড়িয়ে যায় (তবে শেষের অক্ষরটি দুটি বার লেখা হয়)।

নীচে একটি মন্তব্যের জবাব দেওয়ার জন্য আরও একটি সংস্করণ রয়েছে যে ইনপুট বাফারটির আকার জানতে আমি "কৌশল" ব্যবহার করেছি। আসলে এটি কোনও কৌশল নয় বরং প্রয়োজনীয় ইনপুট জ্ঞান (আপনার রূপান্তরকারী ডেটার আকারটি আপনার জানা দরকার)। আমি আলাদা ফাংশনে রূপান্তর কোডটি বের করে এই পরিষ্কার করেছি। আমি টার্গেট বাফারের জন্য সীমানা চেক কোডও যুক্ত করেছি, যা আমরা যদি জানি যে আমরা কী করছি তা সত্যিই প্রয়োজনীয় নয়।


4
এটি কোনও কৌশল নয়, নিছক ধ্রুবক। প্রশ্নের প্রসঙ্গে এটি স্পষ্ট যে আমরা যে উত্সটি হেক্সাডেসিমাল রূপান্তর করতে চাই তার দৈর্ঘ্য সুপরিচিত (আমি আকারের পরিবর্তে কিছু হার্ডকোডযুক্ত 4 রাখতে পারতাম)। সাধারণ ক্ষেত্রে ফাংশনটি পরিচিত দৈর্ঘ্যের কিছু ইনপুটটিতে কল করা উচিত এবং লক্ষ্য বাফারটিতে 3 গুণ + 1 বাইট উপলব্ধ থাকে। এটি অবশ্যই ফোনকারীকে নিশ্চিত করতে হবে, রূপান্তর ফাংশনটি সম্পাদন করার কোনও কারণ নেই। স্ট্রেলেন () কল করা কিছু ক্ষেত্রে উত্সের আকার সন্ধানের উপায় হতে পারে তবে সর্বদা তা নয়। হেক্সে রূপান্তর করার সংখ্যাটিতে শূন্য রয়েছে কী?
ক্রিস

আপনার ফাংশন দ্বারা অনুপ্রাণিত হয়ে আমি একটি সংস্করণ লিখেছিলাম যা স্নিপ্রিন্টফের মতো আউটপুট বাফারে লিখিত বাইটের সংখ্যাও দেয় etc. gist.github.com/cellularmitosis/0d8c0abf7f8aa6a2dff3
জেসন Pepas

আমি মনে করি আপনার নিজের আউটপুট বাফারটি স্বয়ংক্রিয়ভাবে চার স্ট্রিম [আকারের (বুফ) * 3 + 1] ব্যবহার করে সঠিক আকারে করা উচিত;
সিসিল ওয়ার্ড

এছাড়াও আরও অনেক কনসেন্টগুলি আপনাকে রক্ষা করবে। উদাহরণস্বরূপ "কনস্টের স্বাক্ষরবিহীন চর কনস্ট * পি" যাতে আপনি নিশ্চিত করতে পারেন যে ইনপুট বাফারগুলিতে লিখিত হয়নি। একটি ঠিকানা (বা 'পয়েন্টার') স্থির, বা পরিবর্তনশীল করে তোলে এবং অন্যটি সেই ঠিকানায় মেমরিটিকে কেবল পঠনযোগ্য বা না করে তোলে makes প্রায়শই আপনাকে পয়েন্টারগুলি মিশ্রিত করা থেকে বিরত করে। এবং এছাড়াও, অর্থবহ নাম থাকা যা কোন নথিটি দেয় যা কোন বাফার এবং পয়েন্টারগুলি ইনপুট এবং আউটপুট জন্য প্রযোজ্য তাও সহায়তা করবে।
সিসিল ওয়ার্ড

@ সিসিল ওয়ার: যদি না আমার কোড বোগাস ব্যবহার করে কনট ব্যবহার করে তেমন সুরক্ষা দেয় না আপনি পয়েন্টারগুলিকে মিশ্রিত করা বা ইনপুট এবং আউটপুট জন্য একই পয়েন্টার ব্যবহার না করে (ঠিক আছে, এখনও সম্ভব)) তবে কোডটি অপ্টিমাইজ করতে সংকলককেও সহায়তা করবে। এমনকি সীমাবদ্ধ কীওয়ার্ড ব্যবহার করা আরও ভাল (খুব খারাপ C99+++ নয়, তবে প্রায়শই একটি সংকলক এক্সটেনশান হিসাবে উপস্থিত থাকে)। ইনপুট বাফার inএবং আউটপুট বাফারটিকে কল করতে আপনি আরও বেশি অর্থ কী চান out? আমি আউটপুট বাফার সরবরাহের পরিবর্তে একটি স্ট্রিং ব্যবহার এবং একটি অনুলিপি ফেরানোর বিকল্প বেছে নিতে পারি, আধুনিক সি ++ অপ্টিমাইজারগুলিতে বেশি যত্ন নেওয়ার পক্ষে যথেষ্ট।
ক্রিশ্

15

এখানে একটি পদ্ধতি যা দ্রুততর উপায়:


4
এই কোডটিতে একটি বাগ রয়েছে যা কেবলমাত্র অদ্ভুত অ-মুদ্রণযোগ্য ইনপুটগুলিতে প্রকাশিত হয় (গাণিতিকভাবে কী চলছে তা আবিষ্কার করার সময় হয়নি)। হেক্সাডেসিমালের বাইনারি এনকোড করার চেষ্টা করুন ca9e3c972f1c5db40c0b4a66ab5bc1a20ca4457bdbe5e0f8925896d5ed37d726এবং আপনি ÌaÌe3cÌ72f1c5dÌ40c0b4a66Ìb5bÌ1Ì20cÌ4457bÌbÌ5Ì0Ì8Ì258Ì6Ì5Ìd37Ì726বেরিয়ে যাবেন । এটি ঠিক করতে, hex_strলুপের জন্য প্রথম লাইনটির (input[i] >> 4) & 0x0Fবিটটির ভিতরে @ ক্রিসের উত্তর হিসাবে পরিবর্তন করা দরকার। তারপরে এটি কাজ করে।
নিমিরো

ত্রুটি - malloc () ব্যর্থতা পরীক্ষা করে না।
সিসিল ওয়ার্ড

স্বাক্ষরযুক্ত চরগুলি একেবারে সর্বত্র ব্যবহার করা ভাল, কারণ কেউ স্বাক্ষরিত অক্ষরের ঝুঁকি চায় না (পাগল ডিইসি পিডিপি 11 হার্ডওয়্যার বৈশিষ্ট্য), এবং সেইভাবে আপনি স্বাক্ষর করা তুলনাগুলি ভুল হয়ে যাওয়ার বা ডান শিফটগুলির দুর্নীতিবাজ মানগুলি ঝুঁকিপূর্ণভাবে চালাবেন না। এই ক্ষেত্রে, ন্যায়সঙ্গত হওয়ার জন্য, কোডটি সুরক্ষামূলকভাবে সর্বত্র একটি & 0x0F করে যা আপনাকে এখানে সুরক্ষিত করে।
সিসিল ওয়ার্ড

এই রুটিনটির উদ্দেশ্যে মেমরিটিকে কেবল পঠনযোগ্য হিসাবে ঘোষণার জন্য বিন ইনপুট প্যারামিটারটি কনস্ট্যান্ড স্বাক্ষরিত চর কনস্ট * বিন হওয়া উচিত।
সিসিল ওয়ার্ড

4
আমি সিসিল ওয়ার্ডের প্রস্তাবগুলিকে একীভূত করেছি, প্রতিক্রিয়ার জন্য ধন্যবাদ
ইয়ানুথ

14

অনুরূপ উত্তরগুলি ইতিমধ্যে উপরে রয়েছে, নিম্নলিখিত কোডের লাইনটি ঠিক কীভাবে কাজ করে তা ব্যাখ্যা করার জন্য আমি এটিকে যুক্ত করেছি:

এটি শান্ত কৌশল এবং বুঝতে সহজ নয়, আমি নীচের মন্তব্যে ব্যাখ্যাটি রেখেছি:


উজ্জ্বল যুক্তি। এই চ্যালেঞ্জটির মার্জিত নন সি ++ স্ট্রিং উত্তরের জন্য এক ঘন্টা খুঁজছিলেন!
মার্ক টেরিল

6

আমি কেবল নিম্নলিখিতটি যুক্ত করতে চেয়েছিলাম, যদিও এটি সামান্য অফ-টপিক (মান সি নয়), তবে আমি নিজেকে প্রায়শই এটি খুঁজছি এবং প্রথম অনুসন্ধানের মধ্যে এই প্রশ্নটির পিছনে হোঁচট খাচ্ছি। লিনাক্স কার্নেল প্রিন্ট ফাংশন,printk ফাংশনটিতে একটি একক বিন্যাস নির্দিষ্টকরণকারকের মাধ্যমে অ্যারে / মেমরির বিষয়বস্তুগুলি "সরাসরি" আউটপুট দেওয়ার জন্য ফর্ম্যাট স্পেসিফায়ারও রয়েছে:

https://www.kernel.org/doc/Docamentation/printk-formats.txt

... তবে, এই ফর্ম্যাট নির্দিষ্টকরণগুলির স্ট্যান্ডার্ড, ব্যবহারকারী-স্পেসের জন্য উপস্থিত রয়েছে বলে মনে হয় না (s)printf


6

সমাধান

ফাংশন btoxঅবাধ তথ্য পরিবর্তন করে *bbএকটি অসমাপ্ত স্ট্রিং *xpএর nহেক্সাডেসিমেল সংখ্যা:

উদাহরণ

ফলাফল: 00010A0B

লাইভ: Tio.run


1

রূপান্তর সম্পাদনের এটি একটি উপায়:


1

অল্প পরিমাণে ইয়েনিথ সংস্করণ সংশোধিত। এটি কেবলমাত্র আমি এটির ফেরতের মান হিসাবে পেতে চাই

typedef struct {
   size_t len;
   uint8_t *bytes;
} vdata;

char* vdata_get_hex(const vdata data)
{
   char hex_str[]= "0123456789abcdef";

   char* out;
   out = (char *)malloc(data.len * 2 + 1);
   (out)[data.len * 2] = 0;
   
   if (!data.len) return NULL;
   
   for (size_t i = 0; i < data.len; i++) {
      (out)[i * 2 + 0] = hex_str[(data.bytes[i] >> 4) & 0x0F];
      (out)[i * 2 + 1] = hex_str[(data.bytes[i]     ) & 0x0F];
   }
   return out;
}


1

এই ফাংশনটি উপযুক্ত যেখানে ব্যবহারকারী / কলার হেক্স স্ট্রিংটিকে একটি বৈশিষ্ট্যযুক্ত অ্যারে / বাফারে রাখতে চান। ক্যারেক্টার বাফারে হেক্স স্ট্রিং সহ ব্যবহারকারী / কলার তার নিজের ম্যাক্রো / ফাংশনটি এটির যে কোনও স্থানে (যেমন কোনও ফাইলের জন্য) প্রদর্শন করতে বা লগ করতে ব্যবহার করতে পারে। এই ফাংশনটি কলারকে প্রতিটি লাইনে লাগানোর (হেক্স) বাইট সংখ্যা নিয়ন্ত্রণ করতে দেয়।

উদাহরণ: কোড

আউটপুট


0

সি-তে এর কোনও প্রাথমিক নেই I'd আমি এটি সি ++ এর অনুরূপ শব্দার্থক (তবে সিনট্যাক্স নয়!) সহ একটি গতিশীল স্ট্রিং লাইব্রেরি সহ দেখেছি ostringstreamযা এটি সম্ভবত একটি সাধারণ ক্ষেত্রে সমাধানের জন্য অতিরিক্ত জটিলতার জন্য উপযুক্ত নয়।


0

আপনি যদি একটি char *স্ট্রিংয়ে হেক্স মানগুলি সঞ্চয় করতে চান তবে আপনি ব্যবহার করতে পারেনsnprintf । আপনাকে নেতৃস্থানীয় শূন্য এবং কোলন সহ সমস্ত মুদ্রিত অক্ষরের জন্য স্থান বরাদ্দ করতে হবে।

মার্কের উত্তরটি প্রসারিত:

সুতরাং এখন str_bufহেক্স স্ট্রিং থাকবে।


এটি প্রথম 2 টি অক্ষরকে বারবার ওভাররাইট করে .. ডান?
xordon

0

জিঙ্কএক্সের সমাধানটি কোলন ডিলিটারগুলি অন্তর্ভুক্ত করার জন্য অভিযোজিত:


0

যারা আগ্রহী তাদের জন্য আমি এখানে সি ++ সংস্করণ যুক্ত করব ।

এটা hexdump প্রিন্ট হবে bufferদৈর্ঘ্যের countথেকে std::ostream out(আপনি এটি ডিফল্ট বানাতে পারেন std::cout)। প্রতিটি লাইনে bytes_per_lineবাইট থাকবে, প্রতিটি বাইট বড় হাতের দুটি অঙ্কের হেক্স ব্যবহার করে উপস্থাপন করা হবে। বাইটের মধ্যে একটি স্থান থাকবে। এবং লাইনের শেষে বা বাফার শেষে এটি একটি নতুন লাইন প্রিন্ট করবে। যদি bytes_per_line0 তে সেট করা থাকে তবে এটি নতুন_লাইন প্রিন্ট করবে না। নিজের জন্য চেষ্টা করুন।


0

সাধারণ ব্যবহারের জন্য আমি একটি ফাংশন তৈরি করেছি যা ইনপুট স্ট্রিংকে বাইনারি করে (বাইনারি ডেটা):

ব্যবহার:


0

ইয়ানুথের উত্তরের ভিত্তিতে কিন্তু সরলীকৃত।

এখানে দৈর্ঘ্যের dest[]দ্বিগুণ হতে থাকে lenএবং এর বরাদ্দ কলার দ্বারা পরিচালিত হয়।


0

আমি জানি এই প্রশ্নের ইতিমধ্যে একটি উত্তর রয়েছে তবে আমি মনে করি আমার সমাধানটি কারও পক্ষে সহায়তা করতে পারে।

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

এখন, আমি এইভাবে আমার ফাংশনটি ব্যবহার করতে পারি:

Serial বস্তুটি আরডুইনো গ্রন্থাগারের অংশ এবং m_publicKey নিম্নলিখিত ঘোষণার সাথে আমার শ্রেণীর সদস্য uint8_t m_publicKey[32]


0

আপনি স্নিপ্রিন্টফ এবং ম্যালোক দিয়ে সমাধান করতে পারেন।

আউট: bbccdd0fef0f0e0d0c


-2

কী জটিল সমাধান!
মলোক এবং স্প্রিন্ট এবং ক্যাসেট ওহ আমার। (ওজেডের উদ্ধৃতি)
এবং কোথাও একক রেম নয়। গোশ

কেমন আছে এরকম কিছু?


ঠিক আছে, এখন আপনার দুটি হেক্স সংখ্যা রয়েছে। এটি বিভাজনকারীদের যুক্ত করতে এবং রূপান্তর করতে অন্যান্য বাইটগুলির যত্ন নেওয়ার জন্য অবশেষ। একটি লুপ দিয়ে পারে? এটি একটি ফাংশন করুন এবং আপনার মতো আমার কিছু মিলবে (তবে ভার্বোজ এবং পড়া শক্ত)। অন্য পোস্টারে নাম বলার আগে আপনার কমপক্ষে কাজটি শেষ করা উচিত?
ক্রিসস

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