সি # ইনট টু বাইট []


172

আমার এটির এক পদ্ধতিতে রূপান্তর intকরতে byte[]হবে এটি ব্যবহার করা BitConverter.GetBytes()। তবে এটি নিশ্চিত নয় যে এটি নীচের নির্দিষ্টকরণের সাথে মেলে:

একটি এক্সডিআর স্বাক্ষরিত পূর্ণসংখ্যা হল 32-বিট ডেটাম যা একটি পূর্ণসংখ্যা এনকোড করে [-2147483648,2147483647]। পূর্ণসংখ্যা দুটিটির পরিপূরক স্বরলিপিতে প্রতিনিধিত্ব করা হয়। সর্বাধিক এবং সর্বনিম্ন উল্লেখযোগ্য বাইটগুলি যথাক্রমে 0 এবং 3। পূর্ণসংখ্যা নিম্নলিখিত হিসাবে ঘোষণা করা হয়:

উৎস: RFC1014 3.2

কীভাবে আমি বাইট ট্রান্সফর্মেশনটি করতে পারি যা উপরের স্পেসিফিকেশনটি পূরণ করবে?


এটি একটি ভাল প্রশ্ন।
কেওসপ্যান্ডিয়ন

উত্তর:


217

আরএফসি কেবল এটাই বলতে চাইছে যে একটি স্বাক্ষরিত পূর্ণসংখ্যাটি একটি সাধারণ 4-বাইট পূর্ণসংখ্যা যেখানে বাইটগুলি বড়-এন্ডিয়ান উপায়ে অর্ডার করা হয়।

এখন, আপনি সম্ভবত একটি সামান্য এন্ডিয়ান মেশিনে কাজ করছেন এবং BitConverter.GetBytes()আপনাকে বিপরীতগুলি দেবেন byte[]। সুতরাং আপনি চেষ্টা করতে পারেন:

int intValue;
byte[] intBytes = BitConverter.GetBytes(intValue);
Array.Reverse(intBytes);
byte[] result = intBytes;

কোডটি সর্বাধিক পোর্টেবল হওয়ার জন্য, আপনি এটি এর মতো করে করতে পারেন:

int intValue;
byte[] intBytes = BitConverter.GetBytes(intValue);
if (BitConverter.IsLittleEndian)
    Array.Reverse(intBytes);
byte[] result = intBytes;

7
অথবা টোআর্রে ব্যবহার করুন। বাইট [] ফলাফল = বিটকনভার্টার.গেটবাইটস (ইনভ্যালু)। বিপরীত ()। টুআর্রে ();
লার্স ট্রুইজেনস

কেন শেষ লাইন byte[] result = intBytes;? নয় intBytesইতিমধ্যে অ্যারে চাই তোমার?
derHugo

2
@ ওডারহুগো এটি সঠিক, resultএই কোড টুকরোটিতে অপ্রয়োজনীয়। যাইহোক, আমি অনুভব করেছি যে ফলাফলটি স্পষ্টরূপে দেখানো যে ফলাফলটি কী তা অনুমান করার চেয়ে যে তারা ফলাফলটি কিছু ভেরিয়েবলের মধ্যে রয়েছে তা অনুমান করার চেয়ে আরও প্যাডোগোগিকাল intBytes। এছাড়াও, অ্যাসাইনমেন্ট করা সস্তা কারণ এটি মেমরির অনুলিপি করে না বা নতুন মেমরি বরাদ্দ করে না, এটি ইতিমধ্যে বরাদ্দ করা অ্যারেটিতে একটি নতুন নাম যুক্ত করে। তাহলে কেন করবেন না?
প্যারিসিলে

41

এটি করার আরও একটি উপায় এখানে রয়েছে: যেমনটি আমরা সকলেই 1x বাইট = 8x বিট জানি এবং এছাড়াও, "নিয়মিত" পূর্ণসংখ্যা (ইন্ট 32) এ 32 বিট (4 বাইট) থাকে। আমরা >> বিটকে ডান বিট স্থানান্তর করতে >> অপারেটরটি ব্যবহার করতে পারি (>> অপারেটর মান পরিবর্তন করে না))

int intValue = 566;

byte[] bytes = new byte[4];

bytes[0] = (byte)(intValue >> 24);
bytes[1] = (byte)(intValue >> 16);
bytes[2] = (byte)(intValue >> 8);
bytes[3] = (byte)intValue;

Console.WriteLine("{0} breaks down to : {1} {2} {3} {4}",
    intValue, bytes[0], bytes[1], bytes[2], bytes[3]);

1
অ্যারে ইনিশিয়ালাইজার এবং xor (its) এবং & 0xFFবিটগুলি অপ্রয়োজনীয়।
dtb

6
এটি বিগ-এন্ডিয়ান, সুতরাং এমএসবি প্রথমে সঞ্চিত থাকে, সুতরাং আপনার সূচকগুলি বিপরীত করা উচিত।
মার্সিন ডিপ্টুয়া

7
আমরা কি বিপরীত পথে যাওয়ার উদাহরণ যুক্ত করতে পারি? (পূর্ণসংখ্যায় ফিরে বাইটস)
জোকুল

1
পারফরম্যান্সের কারণে আমি এটি ব্যবহার করি। আমি যদি এই ছোট পার্থক্যটির বিষয়ে চিন্তা না করি তবে আমি স্বীকৃত উত্তরের জন্য যাব।
সময়হীন

2
আপনার সেই কোডটি একটি uncheckedব্লকে মোড়ানো উচিত । বর্তমানে এটি কেবল তখনই কাজ করে যদি সংকলক সেটিংসে পূর্ণসংখ্যার ওভারফ্লো চেকিং অক্ষম থাকে।
কোডসইনচওস

25

BitConverter.GetBytes(int) শেষটি ভুল হওয়া ছাড়া প্রায় আপনি যা চান তা করেন।

আপনি জোন স্কিটের এন্ডিয়ানবিট কনভার্টর ক্লাস ব্যবহার করার আগে বা পূর্ণসংখ্য মানের মধ্যে বাইটগুলি অদলবদল করতে IPAddress.HostToNetwork পদ্ধতিটি ব্যবহার করতে পারেন । উভয় পদ্ধতিই বহনযোগ্যতা সম্পর্কিত সঠিক জিনিস (টিএম) করে।BitConverter.GetBytes

int value;
byte[] bytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(value));

3

আমি যখন এই বিবরণটি দেখি, তখন আমার একটা অনুভূতি হয় যে এই এক্সডিআর পূর্ণসংখ্যা কেবল একটি বড়-এন্ডিয়ান "স্ট্যান্ডার্ড" পূর্ণসংখ্যার, তবে এটি সবচেয়ে অবহেলিত উপায়ে প্রকাশ করা হয়েছে। দুটির পরিপূরক স্বরলিপিটি ইউ 2 হিসাবে আরও ভালভাবে জানা এবং এটি আমরা আজকের প্রসেসরগুলিতে ব্যবহার করছি। বাইট ক্রমটি ইঙ্গিত করে যে এটি একটি বিগ-এন্ডিয়ান স্বরলিপি।
সুতরাং, আপনার প্রশ্নের জবাব দেওয়ার জন্য আপনার অ্যারিতে উপাদানগুলি বিপরীত করা উচিত (0 <--> 3, 1 <--> 2), যেমন এগুলি স্বল্প-এডিয়ানতে এনকোড করা আছে। কেবল নিশ্চিত করার জন্য, আপনি প্রথমে BitConverter.IsLittleEndianকোন মেশিনটি চালাচ্ছেন তা পরীক্ষা করা উচিত ।


3

উপরের নমুনায় এই সমস্ত কোড কেন ...

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

আপডেট: যেহেতু পরিণামকে কীভাবে মোকাবেলা করতে হবে সে সম্পর্কে একটি প্রশ্ন রয়েছে তাই আমি একটি ইন্টারফেস যুক্ত করেছি যা কীভাবে বিমূর্ত করতে হয় তা চিত্রিত করে। আরেকটি প্রয়োগকারী কাঠামো বিপরীত ক্ষেত্রে মোকাবেলা করতে পারে

public interface IIntToByte
{
    Int32 Int { get; set;}

    byte B0 { get; }
    byte B1 { get; }
    byte B2 { get; }
    byte B3 { get; }
}

[StructLayout(LayoutKind.Explicit)]
public struct IntToByteLE : UserQuery.IIntToByte
{
    [FieldOffset(0)]
    public Int32 IntVal;

    [FieldOffset(0)]
    public byte b0;
    [FieldOffset(1)]
    public byte b1;
    [FieldOffset(2)]
    public byte b2;
    [FieldOffset(3)]
    public byte b3;

    public Int32 Int {
        get{ return IntVal; }
        set{ IntVal = value;}
    }

    public byte B0 => b0;
    public byte B1 => b1;
    public byte B2 => b2;
    public byte B3 => b3; 
}

2
আপনি এটি কীভাবে ব্যবহার করবেন? এবং দ্বিতীয়ত আপনি একই ফলাফলটি পেতে চাইবেন এমনকি আপনি কি এটি 'বিগ-এন্ডিয়ান' এবং 'লিটল-এন্ডিয়ান' এ চালান।
পিটার

@ পিটার এখানে একটি আপডেট আছে। এটি শিফটগুলির চেয়ে আরও ভাল পারফরম্যান্স করা উচিত
স্টেন পেট্রোভ

হা. মূলত সি # স্ট্রাক্ট হিসাবে একটি সি ++ ইউনিয়ন প্রয়োগ করা হয়। এটি অত্যন্ত দ্রুত এবং বিট কনভার্টার / এন্ডিয়ান সমস্যা সমাধানগুলিতে সমস্ত ধরণের জিনিস প্যাকিং এবং আনপ্যাক করার জন্য ভাল। আইআইআরসি, নওদিও এই পদ্ধতিটি খুব ভাল প্রভাবের জন্য ব্যবহার করে।
ক্রেগ.ফিড

এটি সেরা উত্তর এবং এটি দুঃখজনক যে এটি শীর্ষে নয় তবে কেবল আপনাকে 2019 সালে প্রোগ্রামিংয়ের অবস্থা সম্পর্কে কিছু বলবে
জন ইভান্স

2

আপনি যদি দুটি এর পরিপূরক সহ সংখ্যার উপস্থাপনের বিভিন্ন পদ্ধতি সম্পর্কে আরও সাধারণ তথ্য চান তবে একবার দেখুন:

উইকিপিডিয়ায় দু'জনের পরিপূরক এবং স্বাক্ষরিত নম্বর প্রতিনিধিত্ব


1

অন্যান্য উপায় ব্যবহার করা BinaryPrimitives তাই মত

byte[] intBytes = BitConverter.GetBytes(123); int actual = BinaryPrimitives.ReadInt32LittleEndian(intBytes);


0
using static System.Console;

namespace IntToBits
{
    class Program
    {
        static void Main()
        {
            while (true)
            {
                string s = Console.ReadLine();
                Clear();
                uint i;
                bool b = UInt32.TryParse(s, out i);
                if (b) IntPrinter(i);
            }
        }

        static void IntPrinter(uint i)
        {
            int[] iarr = new int [32];
            Write("[");
            for (int j = 0; j < 32; j++)
            {
                uint tmp = i & (uint)Math.Pow(2, j);

                iarr[j] = (int)(tmp >> j);
            }
            for (int j = 32; j > 0; j--)
            {
                if(j%8==0 && j != 32)Write("|");
                if(j%4==0 && j%8 !=0) Write("'");
                Write(iarr[j-1]);
            }
            WriteLine("]");
        }
    }
}```

-1
byte[] Take_Byte_Arr_From_Int(Int64 Source_Num)
{
   Int64 Int64_Num = Source_Num;
   byte Byte_Num;
   byte[] Byte_Arr = new byte[8];
   for (int i = 0; i < 8; i++)
   {
      if (Source_Num > 255)
      {
         Int64_Num = Source_Num / 256;
         Byte_Num = (byte)(Source_Num - Int64_Num * 256);
      }
      else
      {
         Byte_Num = (byte)Int64_Num;
         Int64_Num = 0;
      }
      Byte_Arr[i] = Byte_Num;
      Source_Num = Int64_Num;
   }
   return (Byte_Arr);
}

দয়া করে আরও ব্যাখ্যা যুক্ত করুন
গ্রেগোর ডোরোশেঙ্কো

উত্তরের জন্য ধন্যবাদ, আপনি কেন স্ট্যাকওভারফ্লো . com /a/ 1318948/58553 ব্যবহার না করে একটি নতুন বাস্তবায়ন লিখতে বেছে নিয়েছেন ? (আপনার সমাধানের সাথে কোনও প্রো বা কনস আছে)
পিটার

যদি কেবলমাত্র একটি ভাষা নয়, যখন প্রকল্পটি বিকাশ করা দরকার, তখন একইরকম ধারণাগুলি কার্যকর করতে হবে এমন পরিস্থিতিতে ভাষাগুলির মধ্যে কোডের মিলের উপলব্ধি কার্যকর হতে পারে। এই উপায় ভুল ধরা সাহায্য করতে পারে। নিশ্চিত যে 'সি #' ফাংশন 'বিটকনভার্টার.গেটবাইটস' এর সাথে 'এন্ডিয়ান' পরীক্ষা করে যা বেশিরভাগ ক্ষেত্রে যা প্রয়োজন তা পরীক্ষা করে দেখছি। এবং আরও, কিছু পরিস্থিতিতে কেবল ইনট 32 (4 বাইট) বা ইন্ট 64 (8 বাইট) এ নয় অন্য সংখ্যক বাইটে রূপান্তর ব্যবহার হতে পারে। ধন্যবাদ।
ভ্যালারি রোড

এটি সত্যই সর্বজনীনভাবে ব্যবহারযোগ্য নয় ... এটি সর্বদা একটি 8-বাইট অ্যারে প্রদান করে, যা 64-বিট ইনট নয় এমন ইনপুট মানগুলির সাথে অনেক অতিরিক্ত কাজ করে। একটি রূপান্তর করার সময় আমি যুক্তিযুক্তভাবে একটি 2-বাইট অ্যারে চাই Int16
নাইয়ারগডস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.