আমরা জাভাতে স্বাক্ষরবিহীন বাইট তৈরি করতে পারি?


185

আমি স্বাক্ষরযুক্ত স্বাক্ষরিত বাইট রূপান্তর করার চেষ্টা করছি। সমস্যাটি হ'ল আমি যে ডেটাটি গ্রহণ করছি তা স্বাক্ষরযুক্ত এবং জাভা স্বাক্ষরবিহীন বাইট সমর্থন করে না, সুতরাং এটি যখন ডেটা পড়ে তখন তা স্বাক্ষরযুক্ত হিসাবে বিবেচনা করে।

আমি স্ট্যাক ওভারফ্লো থেকে পেয়েছি নিম্নলিখিত সমাধান দ্বারা এটি রূপান্তর করার চেষ্টা করেছি।

public static int unsignedToBytes(byte a)
{
    int b = a & 0xFF;
    return b;
}

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



20
java.lang.Byte.toUnsignedInt (বাইট মান);
থিমারকেটকা

উত্তর:


107

আমি নিশ্চিত না যে আমি আপনার প্রশ্নটি বুঝতে পেরেছি।

আমি কেবল এটি চেষ্টা করেছি এবং বাইট -১২ (স্বাক্ষরিত মান) এর জন্য এটি পূর্ণসংখ্যার ২৪৪ (স্বাক্ষরযুক্ত বাইট মানের সমতুল্য তবে একটি হিসাবে টাইপ করা int) ফেরত :

  public static int unsignedToBytes(byte b) {
    return b & 0xFF;
  }

  public static void main(String[] args) {
    System.out.println(unsignedToBytes((byte) -12));
  }

এটা আপনি কি করতে চান?

জাভা 244 টি byteমান হিসাবে প্রকাশ করার অনুমতি দেয় না , সি হিসাবে ধনাত্মক পূর্ণসংখ্যার প্রকাশ করতে Byte.MAX_VALUE(127) আপনাকে অন্য কোনও পূর্ণসংখ্যার ধরণের, যেমন short, intবা ব্যবহার করতে হবে long


1
byte b = (byte)unsignedToBytes((byte) -12); এখন খ ছাপানোর চেষ্টা করুন
জিগার জোশী

101
আপনি কেন এটি সঠিক উত্তর হিসাবে গ্রহণ করেছেন? এটি যা কিছু করে তা আপনার প্রশ্নের মধ্যে উল্লিখিত পদ্ধতির মতোই - বাইটকে স্বাক্ষরবিহীন পূর্ণসংখ্যায় রূপান্তর করুন।
অ্যাডামস্কি

1
কখনও কখনও স্বাক্ষরিত মানগুলি, কখনও কখনও স্বাক্ষরবিহীন হওয়াগুলি গুরুত্বপূর্ণ, তাই সম্ভবত এই কারণেই তিনি এই উত্তরটি গ্রহণ করেছিলেন। (বাইট) (বি এবং 0 এক্সএফ) এর কোনও বোধগম্যতা নেই, তবে (বাইট) (ম্যাথ.মিনি ((বি & 0xff) * 2, 255%)) এর বুদ্ধি রয়েছে, যেমন কম্পিউটার গ্রাফিকগুলিতে এটি কেবল পিক্সড দ্বারা প্রতিনিধিত্ব করবে বাইট দুইবার উজ্জ্বল। :-)
iirekm

3
এটিকে বাইটটো স্বাক্ষরিতও বলা যেতে পারে
হার্নান এচে

193

জাভাতে আদিমরা স্বাক্ষরিত হয় তা মেমরি / ট্রানজিটে কীভাবে উপস্থাপিত হয় তা সম্পর্কিত অপ্রাসঙ্গিক - একটি বাইট কেবল 8 বিট এবং আপনি এটি স্বাক্ষরিত পরিসীমা হিসাবে ব্যাখ্যা করেন কিনা তা আপনার উপর নির্ভর করে না। "এটি স্বাক্ষরিত" বা "এটি স্বাক্ষরবিহীন" বলতে কোনও যাদু পতাকা নেই flag

আদিমরা স্বাক্ষরিত হওয়ার সাথে সাথে জাভা সংকলক আপনাকে বাইটে (বা -128 এর চেয়ে কম) +127 এর চেয়ে বেশি মূল্য নির্ধারণ করতে বাধা দেবে। তবে এটি অর্জনের জন্য আপনাকে কোনও ইনট (বা সংক্ষিপ্ত) ডাউনকায়েস করার কিছু নেই:

int i = 200; // 0000 0000 0000 0000 0000 0000 1100 1000 (200)
byte b = (byte) 200; // 1100 1000 (-56 by Java specification, 200 by convention)

/*
 * Will print a negative int -56 because upcasting byte to int does
 * so called "sign extension" which yields those bits:
 * 1111 1111 1111 1111 1111 1111 1100 1000 (-56)
 *
 * But you could still choose to interpret this as +200.
 */
System.out.println(b); // "-56"

/*
 * Will print a positive int 200 because bitwise AND with 0xFF will
 * zero all the 24 most significant bits that:
 * a) were added during upcasting to int which took place silently
 *    just before evaluating the bitwise AND operator.
 *    So the `b & 0xFF` is equivalent with `((int) b) & 0xFF`.
 * b) were set to 1s because of "sign extension" during the upcasting
 *
 * 1111 1111 1111 1111 1111 1111 1100 1000 (the int)
 * &
 * 0000 0000 0000 0000 0000 0000 1111 1111 (the 0xFF)
 * =======================================
 * 0000 0000 0000 0000 0000 0000 1100 1000 (200)
 */
System.out.println(b & 0xFF); // "200"

/*
 * You would typically do this *within* the method that expected an 
 * unsigned byte and the advantage is you apply `0xFF` only once
 * and than you use the `unsignedByte` variable in all your bitwise
 * operations.
 *
 * You could use any integer type longer than `byte` for the `unsignedByte` variable,
 * i.e. `short`, `int`, `long` and even `char`, but during bitwise operations
 * it would get casted to `int` anyway.
 */
void printUnsignedByte(byte b) {
    int unsignedByte = b & 0xFF;
    System.out.println(unsignedByte); // "200"
}

5
অনেক ক্রিয়াকলাপের জন্য এটি কোনও দ্বিধা তৈরি করে না, তবে কিছু অপারেশনের ক্ষেত্রে এটি করে। যে কোনও উপায়ে আপনি স্বাক্ষরবিহীন হিসাবে বাইট ব্যবহার করতে পারেন বা স্বাক্ষরবিহীন চরটি ব্যবহার করতে পারেন।
পিটার লরি

61
সম্ভাব্য negativeণাত্মক সংখ্যা সহ একটি অ্যারে অ্যাক্সেস অপ্রাসঙ্গিক নয়।
স্টেফান

3
@ স্টেফান - আমি তারে তারা কীভাবে প্রতিনিধিত্ব করছে সে প্রসঙ্গে অপ্রাসঙ্গিক বলতে চাইছি।
অ্যাডামস্কি

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

2
আপনার জন্য @ স্টেফান +1 আপনি যদি 256 টি উপাদানের অ্যারে অ্যাক্সেস করতে বাইট ব্যবহার করছেন তবে একেবারে প্রাসঙ্গিক। জাভা বা সি # তে যাওয়ার আগে সবার কেন সি এবং সি ++ শিখতে হবে তা প্রমাণ করার জন্য এটি একটি দুর্দান্ত উদাহরণ
জিয়ানলুকা ঘেটিনি

46

জাভা ভাষা unsignedকীওয়ার্ডের মতো কিছু সরবরাহ করে না । একটি byteভাষা বৈশিষ্ট অনুযায়ী -128 এর মধ্যে একটি মান প্রতিনিধিত্ব করে - 127. উদাহরণস্বরূপ, যদি একটি byteএকটি কাস্ট করা হয় intজাভা চিহ্ন ও ব্যবহার হিসাবে প্রথম বিট কী ব্যাখ্যা দেবেন চিহ্ন এক্সটেনশন

বলা হচ্ছে, কিছুই আপনাকে byte8 বিট হিসাবে সহজভাবে দেখতে বাধা দেয় না এবং বিটগুলি 0 এবং 255 এর মধ্যে একটি মান হিসাবে ব্যাখ্যা করতে পারেন। কেবল মনে রাখবেন যে অন্য কারও পদ্ধতির উপর আপনার ব্যাখ্যা জোর করে দেওয়ার মতো কিছুই করার নেই। যদি কোনও পদ্ধতি কোনও গ্রহণ করে byte, তবে সেই পদ্ধতিটি স্পষ্টভাবে অন্যথায় বর্ণিত না হলে −128 এবং 127 এর মধ্যে একটি মান গ্রহণ করে।

আপনার সুবিধার জন্য এখানে বেশ কয়েকটি দরকারী রূপান্তর / ম্যানিপুলেশন রয়েছে:

ইন / এ থেকে রূপান্তরগুলি

// From int to unsigned byte
int i = 200;                    // some value between 0 and 255
byte b = (byte) i;              // 8 bits representing that value

// From unsigned byte to int
byte b = 123;                   // 8 bits representing a value between 0 and 255
int i = b & 0xFF;               // an int representing the same value

(অথবা আপনি যদি জাভা 8+ এ থাকেন তবে ব্যবহার করুন Byte.toUnsignedInt))

পার্সিং / ফর্ম্যাট করা

উপরোক্ত রূপান্তরগুলি ব্যবহার করার সর্বোত্তম উপায়:

// Parse an unsigned byte
byte b = (byte) Integer.parseInt("200");

// Print an unsigned byte
System.out.println("Value of my unsigned byte: " + (b & 0xFF));

Arithmetics

2-পরিপূরক উপস্থাপনা যোগ, বিয়োগ এবং গুণনের জন্য "কেবলমাত্র কাজ করে":

// two unsigned bytes
byte b1 = (byte) 200;
byte b2 = (byte) 15;

byte sum  = (byte) (b1 + b2);  // 215
byte diff = (byte) (b1 - b2);  // 185
byte prod = (byte) (b2 * b2);  // 225

বিভাগের জন্য অপারেটরগুলির ম্যানুয়াল রূপান্তর প্রয়োজন:

byte ratio = (byte) ((b1 & 0xFF) / (b2 & 0xFF));

1
'চর' কোনও সংখ্যাকে উপস্থাপন করে না।
লগঅফ

26
এটা সংক্ষিপ্ত করা জন্য: আপনি ভুল করছেন
আইয়ুব

36

জাভাতে কোনও আদিম স্বাক্ষরিত বাইট নেই। সাধারণ জিনিসটি এটি বড় ধরণেরে ফেলে দেওয়া হয়:

int anUnsignedByte = (int) aSignedByte & 0xff;

কাস্ট একটি আইট্রে প্রয়োজনীয়?
nich

এটি একটি অন্তর্নিহিত castালাই হতে পারে, তবে উভয়ভাবেই aালাই রয়েছে। এবং castালাই স্বাক্ষরিত এক্সটেনশন করে। এবং এটি একটি সমস্যা। আপনি যদি একটি সুস্পষ্ট কাস্ট করেন তবে কমপক্ষে আপনি এটি দেখতে পাচ্ছেন।
ফু

21

আমি মনে করি অন্যান্য উত্তরগুলিতে মেমরির প্রতিনিধিত্ব রয়েছে এবং আপনি কীভাবে এটি পরিচালনা করেন আপনি কীভাবে এটি ব্যবহারের পরিকল্পনা করছেন তার প্রসঙ্গে depends আমি যোগ করব যে জাভা 8 স্বাক্ষরযুক্ত প্রকারের সাথে ডিল করার জন্য কিছু সমর্থন যুক্ত করেছে । এই ক্ষেত্রে, আপনি ব্যবহার করতে পারেByte.toUnsignedInt

int unsignedInt = Byte.toUnsignedInt(myByte);

4

পার্শ্ব নোট, আপনি যদি এটি মুদ্রণ করতে চান তবে আপনি কেবল বলতে পারেন

byte b = 255;
System.out.println((b < 0 ? 256 + b : b));

6
এত জটিল কেন? println(b & 0xff)যথেষ্ট
ফুক্লিভি


0

অ্যাডামস্কি সেরা উত্তরটি সরবরাহ করেছিলেন, তবে এটি পুরোপুরি সম্পূর্ণ নয়, সুতরাং তার উত্তরটি পড়ুন, কারণ এতে আমি যে বিবরণ দিই না তা ব্যাখ্যা করে।

আপনার যদি এমন কোনও সিস্টেম ফাংশন থাকে যাতে এটিতে স্বাক্ষরবিহীন বাইটের দরকার হয় তবে আপনি স্বাক্ষরিত বাইটটি পাস করতে পারেন কারণ এটি স্বয়ংক্রিয়ভাবে এটিকে স্বাক্ষরবিহীন বাইট হিসাবে বিবেচনা করবে।

সুতরাং যদি কোনও সিস্টেমের ফাংশনে চারটি বাইটের প্রয়োজন হয়, উদাহরণস্বরূপ, 192 168 0 1 স্বাক্ষরযুক্ত বাইট হিসাবে আপনি পাস করতে পারেন -64 -88 0 1, এবং ফাংশনটি এখনও কাজ করবে, কারণ ফাংশনে তাদের পাস করার কাজটি তাদের স্বাক্ষর করবে না ।

তবে আপনার এই সমস্যা হওয়ার সম্ভাবনা নেই কারণ ক্র্যাস-প্ল্যাটফর্মের সামঞ্জস্যের জন্য সিস্টেম ফাংশনগুলি ক্লাসের পিছনে লুকানো থাকে, যদিও জাভা.ইও পড়ার কয়েকটি পদ্ধতি ইন্টি হিসাবে অবিরত বাইটগুলি ফিরিয়ে দেয়।

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


1
স্বাক্ষরযুক্ত বা স্বাক্ষরবিহীন বাইটের মতো জিনিস নেই।
ভ্লাস্টিমিল ওভেক

আপনি ঠিক কীভাবে লিখছেন এবং আপনার উদাহরণে বাইটগুলি পড়ছেন?
ভ্লাস্টিমিল ওভেক

0

আপনি এটিও করতে পারেন:

public static int unsignedToBytes(byte a)
{
    return (int) ( ( a << 24) >>> 24);
}    

ব্যাখ্যা:

চল বলি a = (byte) 133;

স্মৃতিতে এটি সংরক্ষণ করা হয়েছে: "1000 0101" (হেক্সে 0x85)

সুতরাং এর উপস্থাপনাটি স্বাক্ষরযুক্ত = 133, স্বাক্ষরিত = -123 (2 এর পরিপূরক হিসাবে) অনুবাদ করে

a << 24

বাম শিফটটি যখন 24 টি বিট বামে সঞ্চালিত হয়, ফলাফলটি এখন 4 বাইট পূর্ণসংখ্যা যা এটি হিসাবে উপস্থাপিত হয়:

"10000101 00000000 00000000 00000000" (বা হেক্সে "0x85000000")

তারপর আমাদের আছে

(একটি << 24) >>> 24

এবং এটি আবার ডান 24 বিটে স্থানান্তরিত করে তবে নেতৃস্থানীয় শূন্যগুলি পূরণ করে। সুতরাং এটির ফলাফল:

"00000000 00000000 00000000 10000101" (বা হেক্সে "0x00000085")

এবং এটি স্বাক্ষরযুক্ত প্রতিনিধিত্ব যা সমান 133।

আপনি যদি কাস্ট করার চেষ্টা করেছিলেন a = (int) a; তবে যা হবে তা হ'ল এটি 2 এর পরিপূরক উপস্থাপনা বাইট রাখে এবং 2 এর পরিপূরক হিসাবে এটিও সংরক্ষণ করে:

(int) "10000101" ---> "11111111 11111111 11111111 10000101"

এবং এটি অনুবাদ করে: -123


2
2019 সালে, এটি অপ্রয়োজনীয়। শুধু ব্যবহার java.lang.Byte.toUnsignedInt(byte value)। এবং আপনি যদি এখনও জাভা 8 ব্যবহার করছেন না, তবে ASAP আপগ্রেড করুন। জাভা 7 এবং তার আগের জীবন শেষ।
স্টিফেন সি

0

আমি এই তথ্যটি জাভাতে কোনও ফাংশনের পরামিতি হিসাবে ব্যবহার করার চেষ্টা করছি যা কেবলমাত্র বাইটকে প্যারামিটার হিসাবে গ্রহণ করে

এটি কোনও পূর্ণসংখ্যাকে গ্রহণ করে এমন কোনও ফাংশন থেকে আলাদা নয় যেখানে আপনি 2 ^ 32-1 এর চেয়ে বড় মানটি পাস করতে চান।

মনে হচ্ছে এটি কীভাবে ফাংশনটি সংজ্ঞায়িত ও ডকুমেন্ট করা যায় তার উপর নির্ভর করে; আমি তিনটি সম্ভাবনা দেখতে পাচ্ছি:

  1. এটি স্পষ্টতই নথিভুক্ত করতে পারে যে ফাংশনটি বাইটটিকে একটি স্বাক্ষরবিহীন মান হিসাবে বিবেচনা করে, এক্ষেত্রে ফাংশনটি সম্ভবত আপনার প্রত্যাশাটি করা উচিত তবে এটি ভুল প্রয়োগ করা হবে বলে মনে হয়। পূর্ণসংখ্যার ক্ষেত্রে, ফাংশনটি সম্ভবত স্বাক্ষরবিহীন পূর্ণসংখ্যা হিসাবে পরামিতি ঘোষণা করবে, তবে বাইট ক্ষেত্রে এটি সম্ভব নয়।

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

  3. ডকুমেন্টেশনটি কিছুই বলতে পারে না, এক্ষেত্রে নেতিবাচক প্যারামিটারটি ভাল, একটি নেতিবাচক প্যারামিটার এবং এর কোনও অর্থ রয়েছে কিনা তা ফাংশনটি কী করে তার উপর নির্ভর করে। যদি এটি অর্থহীন হয় তবে সম্ভবত ফাংশনটি সত্যই সংজ্ঞায়িত করা উচিত / ডকুমেন্টেড হিসাবে (2)। যদি এটি অজ্ঞাতসারে পদ্ধতিতে অর্থবহ হয় (উদাহরণস্বরূপ অ-নেতিবাচক মানগুলি অ্যারেতে সূচক হিসাবে ব্যবহৃত হয়, এবং নেতিবাচক মানগুলি অ্যারের প্রান্ত থেকে ফিরে সূচীকরণের জন্য ব্যবহৃত হয় সুতরাং -১ এর অর্থ শেষ উপাদানটি) ডকুমেন্টেশনটি এটি কী বলবে মানে এবং আমি আশা করব যে এটি যাইহোক আপনি এটি করতে চান তা নয়।


হুম, আমি মনে করি আমি কেবল একটি উত্তর পোস্ট করেছি যা বাইটসের স্বাক্ষর সম্পর্কে অন্য প্রশ্নের উদ্দেশ্যে ছিল, তবে আমি মনে করি এটি এখনও এখানে কিছুটা প্রাসঙ্গিক ...
কেভিন মার্টিন

-1

আপনার যদি এমন কোনও ফাংশন থাকে যা অবশ্যই স্বাক্ষরিত বাইটটি পাস করতে হবে, আপনি যদি স্বাক্ষরবিহীন বাইটটি পাস করেন তবে আপনি এটি করার কী প্রত্যাশা করবেন?

আপনি অন্য কোনও ডেটা ধরণের ব্যবহার করতে পারবেন না কেন?

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


-1

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


অন্যের উত্তর দেখুন, আপনি মনে করেন যে আপনার উত্তরটি সেরা / সহায়ক? অল্প করে বর্ণনা করুন এবং মন্তব্যগুলিতে যুক্ত করুন
যুবিন প্যাটেল

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

আমি থোর 84no এর সাথে একমত: বাইটগুলি সংখ্যা নয় এবং এর সাইনও না থাকা উচিত। অন্যদিকে, যেহেতু তারা সংখ্যা নয় আমাদের + এবং - অপারেটর / থাকা উচিত নয়। কেবলমাত্র বিটওয়াইস অপারেটরগুলি ব্যবহার করে সূক্ষ্মভাবে কাজ করে, অন্যদিকে শিফট অপারেটরগুলি যেমন পছন্দ করে তেমন কাজ করে না, এবং প্রকৃতপক্ষে জাভা একটি স্থানান্তরিত বাইটকে প্রচার করে।
ব্যবহারকারী1708042

1
@ ভ্লাস্টিমিল ওভাক এই ক্ষেত্রে আক্ষরিক অসম্ভব, এটিই আন্দোলনকারী thing আপনি হয় পুনরাবৃত্তি x & 0xFFসর্বত্র আপনি এটি প্রয়োজন অথবা আপনি ভালো কিছু পুনরাবৃত্তি behaveLikeAnUnsignedByte(x)সর্বত্র। আপনি বাইট মান বা বাইট অ্যারে ব্যবহার করেন এমন প্রতিটি স্থানের জন্য এটি সই করা দরকার যা এই স্বীকৃতিটি এড়াতে পারে না ce আপনি এমন কোনও প্রোটোকল প্রয়োগ করতে পারবেন না যা কেবল বাইট ভেরিয়েবলের একক রেফারেন্স সহ বাইট মানগুলি পড়তে এবং লিখতে পারে। আপনার সরলতর দৃষ্টিভঙ্গি ব্যাখ্যা করতে পারে যে তারা কেন এটি ঠিক করার জন্য কখনই যত্ন নেন না।
Thor84no

-1

জাভাতে কোনও স্বাক্ষরবিহীন বাইট নেই, তবে আপনি যদি বাইট প্রদর্শন করতে চান তবে আপনি এটি করতে পারেন,

int myInt = 144;

byte myByte = (byte) myInt;

char myChar = (char) (myByte & 0xFF);

System.out.println("myChar :" + Integer.toHexString(myChar));

আউটপুট:

myChar : 90

আরও তথ্যের জন্য, দয়া করে পরীক্ষা করুন, জাভাতে কোনও হেক্স / বাইট মান কীভাবে প্রদর্শন করতে হয়


এটি নিজের সংজ্ঞা দেওয়ার দরকার নেই। java.lang.Byte.toUnsignedInt(byte value);এই জন্য বিদ্যমান।
আলেকজান্ডার - মনিকা

-2

জাভাতে সীমাবদ্ধতা অনুসারে, স্বাক্ষরযুক্ত বাইট বর্তমান ডেটা-টাইপ ফর্ম্যাটে প্রায় অসম্ভব। আপনি যা প্রয়োগ করছেন তার জন্য আপনি অন্য কোনও ভাষার গ্রন্থাগারের জন্য যেতে পারেন এবং তারপরে আপনি জেএনআই ব্যবহার করে তাদের কল করতে পারেন ।


আমি মনে করি না যে তিনি এটিকে স্বাক্ষরিত বাইট হিসাবে সঞ্চয় করতে চান। তিনি এটি একটি স্বাক্ষরিত বাইট হিসাবে গ্রহণ করছেন এবং তিনি এটি কোনও ইনট হিসাবে সংরক্ষণ করতে চান যা পুরোপুরি বৈধ। তার সমস্যাটি হ'ল তিনি যেখান থেকে ইনপুট পাচ্ছেন তা বাইট হিসাবে 0 এবং 255 এর মধ্যে একটি মানের প্রতিনিধিত্ব করছে, তবে জাভা ব্যাখ্যা করেছেন যে দ্বিগুণ স্বাক্ষরিত মান হিসাবে জাভা স্বাক্ষরিত বাইটগুলি সমর্থন করে না।
জ্যাক

-2

হ্যা এবং না. এই সমস্যাটি নিয়ে আমি প্রায় খনন করে চলেছি। আমি এটি বুঝতে চাই:

আসল বিষয়টি হ'ল জাভা ইন্টিজারে -128 থেকে 127 এ স্বাক্ষর করেছে .. জাভাতে স্বাক্ষরযুক্ত এমনটি উপস্থাপন করা সম্ভব:

public static int toUnsignedInt(byte x) {
    return ((int) x) & 0xff;
}

আপনি যদি উদাহরণ হিসাবে স্বাক্ষরিত হওয়ার জন্য -12 স্বাক্ষরিত নম্বরটি যুক্ত করেন তবে 244 পাবেন But তবে আপনি সেই নম্বরটি আবার সাইন ইন ব্যবহার করতে পারেন, এটি আবার স্বাক্ষরিত স্থানান্তরিত করতে হবে এবং এটি আবার -12 হবে।

আপনি যদি জাভা বাইটে 244 যোগ করার চেষ্টা করেন তবে আপনি অফিন্ডেক্সএক্সেপশনটি পেয়ে যাবেন।

চিয়ার্স ..


3
এটি নিজের সংজ্ঞা দেওয়ার দরকার নেই। java.lang.Byte.toUnsignedInt(byte value);এই জন্য বিদ্যমান।
আলেকজান্ডার - মনিকা পুনরায়

-3

আপনি যদি জাভাতে স্বাক্ষরবিহীন বাইটগুলি চান, আপনার আগ্রহী নম্বর থেকে কেবল 256 বিয়োগ করুন It এটি একটি নেতিবাচক মান সহ দুটি পরিপূরক উত্পাদন করবে , যা স্বাক্ষরবিহীন বাইটে পছন্দসই সংখ্যা।

উদাহরণ:

int speed = 255; //Integer with the desired byte value
byte speed_unsigned = (byte)(speed-256);
//This will be represented in two's complement so its binary value will be 1111 1111
//which is the unsigned byte we desire.

এনএক্সটি ইটটিকে প্রোগ্রাম করার জন্য লেজেওএস ব্যবহার করার সময় আপনাকে এই জাতীয় নোংরা হ্যাকগুলি ব্যবহার করা দরকার ।


আপনি বুঝতে পেরেছেন যে 255 এর বাইনারি মানটিও 1111 1111, সুতরাং কোনও বিয়োগের প্রয়োজন নেই, তাই না?
নিক হোয়াইট

@ নিকওহাইট, হ্যাঁ বাইনারি তবে জাভা ব্যবহার করেছে এর 2 টি কমেন্ট যেখানে 255 11111111 নয়
XapaJIaMnu

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