বাইট ফাইল করুন


89

আমার একটি হেক্সাডেসিমাল স্ট্রিং রয়েছে (উদাঃ 0CFE9E69271557822FE715A8B3E564BE) এবং আমি এটি কোনও বাইট হিসাবে কোনও ফাইলে লিখতে চাই। উদাহরণ স্বরূপ,

Offset      0  1  2  3  4  5  6  7   8  9 10 11 12 13 14 15
00000000   0C FE 9E 69 27 15 57 82  2F E7 15 A8 B3 E5 64 BE   .þži'.W‚/ç.¨³åd¾

নেট এবং সি # ব্যবহার করে আমি কীভাবে এটি সম্পাদন করতে পারি?



4
@ স্টিভেন: কেবলমাত্র আংশিক। সবচেয়ে গুরুত্বপূর্ণ অংশ নয়।
জন দো

4
একটি বাইটের [] অ্যারে এর সম্ভাব্য নকলটি সি # তে কোনও ফাইলে লেখা যেতে পারে? (এছাড়াও সম্ভবত কেবল একটি আংশিক সদৃশ)।
জেফ বি

উত্তর:


159

আমি যদি আপনাকে সঠিকভাবে বুঝতে পারি তবে এটি কৌশলটি করা উচিত। using System.IOআপনার ফাইলটি এটি ইতিমধ্যে না থাকলে আপনার শীর্ষে যুক্ত করা দরকার ।

public bool ByteArrayToFile(string fileName, byte[] byteArray)
{
    try
    {
        using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
        {
            fs.Write(byteArray, 0, byteArray.Length);
            return true;
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception caught in process: {0}", ex);
        return false;
    }
}

76

সবচেয়ে সহজ উপায় হ'ল আপনার হেক্সাডেসিমাল স্ট্রিংটিকে বাইট অ্যারেতে রূপান্তর করা এবং File.WriteAllBytesপদ্ধতিটি ব্যবহার করা ।

এই প্রশ্নটিStringToByteArray() থেকে পদ্ধতিটি ব্যবহার করে আপনি এরকম কিছু করতে চান:

string hexString = "0CFE9E69271557822FE715A8B3E564BE";

File.WriteAllBytes("output.dat", StringToByteArray(hexString));

StringToByteArrayপদ্ধতি নীচের অন্তর্ভুক্ত করা হয়:

public static byte[] StringToByteArray(string hex) {
    return Enumerable.Range(0, hex.Length)
                     .Where(x => x % 2 == 0)
                     .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                     .ToArray();
}

Thx, এই কাজ করে। আমি কীভাবে একই ফাইলটিতে বাইট যুক্ত করতে পারি? (প্রথম 'স্ট্রিং'-এর পরে)
জন দো

4
@ রবার্তিকো: আপনি WritAllBytes এর তৃতীয় প্যারামিটারে সত্যের একটি বুলিয়ান মান যুক্ত করুন। আপনি কি এখনও এমএসডিএন আবিষ্কার করেছেন? WritAllBytes সংযোজন অনুসন্ধান করার সময় এটিই প্রথম গুগল লিঙ্ক।

4
বুলিয়ান মান যোগ করার সময় আমি একটি ত্রুটি পেয়েছি 'পদ্ধতির জন্য কোনও ওভারলোড নয়' WritAllBytes '' 3 'আর্গুমেন্ট' নেয়। এমএসডিএন বর্ণনা করে: 'তবে, আপনি যদি কোনও লুপ ব্যবহার করে কোনও ফাইলে ডেটা যুক্ত করে থাকেন তবে একটি বাইনারি রাইটার অবজেক্ট আরও ভাল পারফরম্যান্স সরবরাহ করতে পারে কারণ আপনাকে কেবল একবার ফাইল খুলতে হবে এবং বন্ধ করতে হবে।' আমি একটি লুপ ব্যবহার করছি আমি @ 0A0D থেকে উদাহরণটি ব্যবহার করেছি এবং 'ফাইলমোড.ক্রেট' পরিবর্তন করে 'ফাইলমোড.অ্যাপেন্ড' রেখেছি।
জন দো

3

এটা চেষ্টা কর:

private byte[] Hex2Bin(string hex) 
{
 if ((hex == null) || (hex.Length < 1)) {
  return new byte[0];
 }
 int num = hex.Length / 2;
 byte[] buffer = new byte[num];
 num *= 2;
 for (int i = 0; i < num; i++) {
  int num3 = int.Parse(hex.Substring(i, 2), NumberStyles.HexNumber);
  buffer[i / 2] = (byte) num3;
  i++;
 }
 return buffer;
}

private string Bin2Hex(byte[] binary) 
{
 StringBuilder builder = new StringBuilder();
 foreach(byte num in binary) {
  if (num > 15) {
   builder.AppendFormat("{0:X}", num);
  } else {
   builder.AppendFormat("0{0:X}", num); /////// 大于 15 就多加个 0
  }
 }
 return builder.ToString();
}

Thx, এটিও ঠিক কাজ করে। আমি কীভাবে একই ফাইলটিতে বাইট যুক্ত করতে পারি? (প্রথম 'স্ট্রিং'-এর পরে)
জন দো

2

আপনি হেক্স স্ট্রিংকে বাইট অ্যারে রূপান্তর করেন।

public static byte[] StringToByteArray(string hex) {
return Enumerable.Range(0, hex.Length)
                 .Where(x => x % 2 == 0)
                 .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                 .ToArray();
}

ক্রেডিট: জারেড পার

এবং তারপরে ফাইল সিস্টেমে লেখার জন্য WritAllBytes ব্যবহার করুন।


4
যদি আপনি এই প্রশ্নের উত্তর হিসাবে বিদ্যমান স্ট্যাক ওভারফ্লো উত্তরটি উল্লেখ করছেন তবে এটি একটি নিরাপদ বাজি যে এটি একটি সদৃশ প্রশ্ন এবং এরূপ হিসাবে চিহ্নিত করা উচিত।
ক্রিসএফ

4
এক্ষেত্রে এটি কেবল তার প্রশ্নের অংশের উত্তর দিয়েছে, তাই আমি অনুভব করেছি যে এটির কোনও ডুপ হিসাবে চিহ্নিত করার দরকার নেই। তিনি কেবল সেখানে সেই জ্ঞান নিয়ে অর্ধেক যেতে পারতেন।
খেপরি

0

এই উদাহরণটি 6 বাইটকে একটি বাইট অ্যারেতে পড়ে এবং এটি অন্য বাইট অ্যারেতে লিখে দেয়। এটি বাইটগুলির সাথে একটি এক্সওআর অপারেশন করে যাতে ফাইলটিতে লিখিত ফলাফলটি মূল শুরুর মানগুলির সমান। ফাইলটি সর্বদা আকারে 6 বাইট হয়, যেহেতু এটি 0 অবস্থানে লেখা হয়।

using System;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
        byte[] b1 = { 1, 2, 4, 8, 16, 32 };
        byte[] b2 = new byte[6];
        byte[] b3 = new byte[6];
        byte[] b4 = new byte[6];

        FileStream f1;
        f1 = new FileStream("test.txt", FileMode.Create, FileAccess.Write);

        // write the byte array into a new file
        f1.Write(b1, 0, 6);
        f1.Close();

        // read the byte array
        f1 = new FileStream("test.txt", FileMode.Open, FileAccess.Read);

        f1.Read(b2, 0, 6);
        f1.Close();

        // make changes to the byte array
        for (int i = 1; i < b2.Length; i++)
        {
            b2[i] = (byte)(b2[i] ^ (byte)10); //xor 10
        }

        f1 = new FileStream("test.txt", FileMode.Open, FileAccess.Write);
        // write the new byte array into the file
        f1.Write(b2, 0, 6);
        f1.Close();

        f1 = new FileStream("test.txt", FileMode.Open, FileAccess.Read);

        // read the byte array
        f1.Read(b3, 0, 6);
        f1.Close();

        // make changes to the byte array
        for (int i = 1; i < b3.Length; i++)
        {
            b4[i] = (byte)(b3[i] ^ (byte)10); //xor 10
        }

        f1 = new FileStream("test.txt", FileMode.Open, FileAccess.Write);

        // b4 will have the same values as b1
        f1.Write(b4, 0, 6);
        f1.Close();
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.