Sameera Abubaker نشر 16 يوليو 2020 أرسل تقرير نشر 16 يوليو 2020 لدي قيمة نصية في متغير يحوي رقم بالنظام السادس عشر مثلا : Str="1A" وارغب في وضع هذه القيمة في متغير من نوع byte وليس byte array فارجو افادتي في ذلك بلغة الجافا وشكر اقتباس
1 محمد ربيع زليول نشر 16 يوليو 2020 أرسل تقرير نشر 16 يوليو 2020 في البداية سنقوم بتحويل كل حرف في النظام السادس عشر Hexadicimal إلى مقابله في binary، ثم سنقوم بجمع القيمتين: مثال، سنقوم بتحويل 1A من النظام السادس عشر إلى byte. في البداية سنقوم بتحويل 1 إلى النظام الثنائي وقيمته هي 0001 ثم سنقوم بتحويل A إلى النظام الثنائي وقيمته هي 1010 ثم سنجمع القيمتين ليكون الناتج هو 00011010 Hexadecimal: 1A 1 = 0001 // النظام الثنائي A = 1010 // النظام الثنائي 1A = 0001 1010 // إذن وفي جافا يمكن كتابة دالة للقيام بعملية التحويل بهذه الطريقة بهذا الشكل: public byte hexToByte(String hexString) { int firstDigit = toDigit(hexString.charAt(0)); int secondDigit = toDigit(hexString.charAt(1)); return (byte) ((firstDigit << 4) + secondDigit); } private int toDigit(char hexChar) { int digit = Character.digit(hexChar, 16); if(digit == -1) { throw new IllegalArgumentException( "Invalid Hexadecimal Character: "+ hexChar); } return digit; } ولتجربة المثال نكتب: import java.util.Arrays; public class Main { private int toDigit(char hexChar) { int digit = Character.digit(hexChar, 16); if(digit == -1) { throw new IllegalArgumentException( "Invalid Hexadecimal Character: "+ hexChar); } return digit; } public byte hexToByte(String hexString) { int firstDigit = toDigit(hexString.charAt(0)); int secondDigit = toDigit(hexString.charAt(1)); return (byte) ((firstDigit << 4) + secondDigit); } public static void main(String[] args) { Main main = new Main(); String str = "1A"; byte value = main.hexToByte(str); System.out.println( value ); } } يمكنك تجربة المثال على الرابط التالي. اقتباس
0 Sameera Abubaker نشر 16 يوليو 2020 الكاتب أرسل تقرير نشر 16 يوليو 2020 بتاريخ On 16/7/2020 at 13:49 قال محمد ربيع زليول: في البداية سنقوم بتحويل كل حرف في النظام السادس عشر Hexadicimal إلى مقابله في binary، ثم سنقوم بجمع القيمتين: مثال، سنقوم بتحويل 1A من النظام السادس عشر إلى byte. في البداية سنقوم بتحويل 1 إلى النظام الثنائي وقيمته هي 0001 ثم سنقوم بتحويل A إلى النظام الثنائي وقيمته هي 1010 ثم سنجمع القيمتين ليكون الناتج هو 00011010 Hexadecimal: 1A 1 = 0001 // النظام الثنائي A = 1010 // النظام الثنائي 1A = 0001 1010 // إذن وفي جافا يمكن كتابة دالة للقيام بعملية التحويل بهذه الطريقة بهذا الشكل: public byte hexToByte(String hexString) { int firstDigit = toDigit(hexString.charAt(0)); int secondDigit = toDigit(hexString.charAt(1)); return (byte) ((firstDigit << 4) + secondDigit); } private int toDigit(char hexChar) { int digit = Character.digit(hexChar, 16); if(digit == -1) { throw new IllegalArgumentException( "Invalid Hexadecimal Character: "+ hexChar); } return digit; } ولتجربة المثال نكتب: import java.util.Arrays; public class Main { private int toDigit(char hexChar) { int digit = Character.digit(hexChar, 16); if(digit == -1) { throw new IllegalArgumentException( "Invalid Hexadecimal Character: "+ hexChar); } return digit; } public byte hexToByte(String hexString) { int firstDigit = toDigit(hexString.charAt(0)); int secondDigit = toDigit(hexString.charAt(1)); return (byte) ((firstDigit << 4) + secondDigit); } public static void main(String[] args) { Main main = new Main(); String str = "1A"; byte value = main.hexToByte(str); System.out.println( value ); } } يمكنك تجربة المثال على الرابط التالي. أظهر المزيد ماذا عن التحويل من نوع int الى نوع byte ??? اذا كان المتغير معرف مثلا كالتالي : int x = 0x1A ; فكيف يكون التحويل الى byte ؟؟؟ اقتباس
0 محمد ربيع زليول نشر 16 يوليو 2020 أرسل تقرير نشر 16 يوليو 2020 بتاريخ On 16/7/2020 at 15:59 قال Sameera Abubaker: ماذا عن التحويل من نوع int الى نوع byte ??? أظهر المزيد يمكن تعريف المتغير عن طريق class Integer ثم إستخدام دالة byteValue للحصول على قيمة byte Integer x = new Integer(0xA1); byte b = x.byteValue(); اقتباس
0 Sameera Abubaker نشر 16 يوليو 2020 الكاتب أرسل تقرير نشر 16 يوليو 2020 شكرا ولكن الطريقتان لم تعطي القيمة المتوقعة . احاول العمل على خوارزمية SubByte ولكن الى الان المشكلة في اختلاف انواع المتغيرات اقتباس
0 محمد ربيع زليول نشر 16 يوليو 2020 أرسل تقرير نشر 16 يوليو 2020 بتاريخ On 16/7/2020 at 16:42 قال Sameera Abubaker: احاول العمل على خوارزمية SubByte ولكن الى الان المشكلة في اختلاف انواع المتغيرات أظهر المزيد ما هي المشكلة بالضبط؟ اقتباس
0 Sameera Abubaker نشر 16 يوليو 2020 الكاتب أرسل تقرير نشر 16 يوليو 2020 بتاريخ On 16/7/2020 at 16:45 قال محمد ربيع زليول: ما هي المشكلة بالضبط؟ أظهر المزيد المشكلة هي ان النتيجة صارت byte array وليست byte اقتباس
0 محمد ربيع زليول نشر 16 يوليو 2020 أرسل تقرير نشر 16 يوليو 2020 بتاريخ On 16/7/2020 at 16:52 قال Sameera Abubaker: المشكلة هي ان النتيجة صارت byte array وليست byte أظهر المزيد هل من الممكن مشاركة الكود الخاص بك لفهم ما الذي تحاول فعله، وأين تكمن المشكلة. اقتباس
0 Sameera Abubaker نشر 16 يوليو 2020 الكاتب أرسل تقرير نشر 16 يوليو 2020 (معدل) static String[][] sbox={{"63","7C","77","7B","F2","6B","6F","C5","30","01","67","2B","FE","D7","AB","76"}, {"CA","82","C9","7D","FA","59","47","F0","AD","D4","A2","AF","9C","A4","72","C0"}, {"B7","FD","93","26","36","3F","F7","CC","34","A5","E5","F1","71","D8","31","15"}, {"04","C7","23","C3","18","96","05","9A","07","12","80","E2","EB","27","B2","75"}, {"09","83","2C","1A","1B","6E","5A","A0","52","3B","D6","B3","29","E3","2F","84"}, {"53","D1","00","ED","20","FC","B1","5B","6A","CB","BE","39","4A","4C","58","CF"}, {"D0","EF","AA","FB","43","4D","33","85","45","F9","02","7F","50","3C","9F","A8"}, {"51","A3","40","8F","92","9D","38","F5","BC","B6","DA","21","10","FF","F3","D2"}, {"CD","0C","13","EC","5F","97","44","17","C4","A7","7E","3D","64","5D","19","73"}, {"60","81","4F","DC","22","2A","90","88","46","EE","B8","14","DE","5E","0B","DB"}, {"E0","32","3A","0A","49","06","24","5C","C2","D3","AC","62","91","95","E4","79"}, {"E7","C8","37","6D","8D","D5","4E","A9","6C","56","F4","EA","65","7A","AE","08"}, {"BA","78","25","2E","1C","A6","B4","C6","E8","DD","74","1F","4B","BD","8B","8A"}, {"70","3E","B5","66","48","03","F6","0E","61","35","57","B9","86","C1","1D","9E"}, {"E1","F8","98","11","69","D9","8E","94","9B","1E","87","E9","CE","55","28","DF"}, {"8C","A1","89","0D","BF","E6","42","68","41","99","2D","0F","B0","54","BB","16"}}; public static void SubByte(byte[][] s) { System.out.println("Inside subByte :"); int i,j,r,c; String su,x1,x2,str; for(i = 0 ; i <4 ;i++) { for(j = 0; j <4 ; j++) { su = Integer.toHexString(s[i][j]); x1=su.substring(0,1) ; x2=su.substring(1,2) ; r =Integer.parseInt(x1,16); c = Integer.parseInt(x2,16); //subByte process s[i][j]=sbox[r][c];//here the error s[i][j] should be in binary bt sbox[r][c] value in string System.out.println(s); } } return s ; }//end SubByte fuction تم التعديل في 16 يوليو 2020 بواسطة Sameera Abubaker 1 اقتباس
0 محمد ربيع زليول نشر 16 يوليو 2020 أرسل تقرير نشر 16 يوليو 2020 بتاريخ On 16/7/2020 at 17:00 قال Sameera Abubaker: أظهر المزيد أحتاج صراحة لجزء main وطريقة إستخدام الكود أيضًا، لكني قمت ببعض التغيرات هنا، لا أعلم أنها ستحل المشكلة أم لا. بما أنا sbox هو متغير من نوقع مصفوف String، قمت بتغير هذه دالة SubByte لتستقبل مصفوفة ثنائية الأبعاد من نوع String وليس Bytes. ثم قمت بإنشاء متغير جديد لنستطيع من خلاله إرجاع قيمة بنوع byte. قمت أيضًا بتغير نوع الدالة من void إلى byte from: public static void SubByte (byte[][] s) to: public static byte[][] SubByte (String[][] s) وبعض التغيرات الأخرى للتناسب مع التعديلات: from: su = Integer.toHexString(s[i][j]); to: su = s[i][j]; ------------ from: s[i][j]=sbox[r][c]; to: new_variable[i][j] = hexToByte(sbox[r][c]); لتصبح الدالة كالتالي: public static byte[][] SubByte (String[][] s) // قمت بتغير نوع هنا { System.out.println ("Inside subByte :"); byte[][] new_variable = new byte[16][16];// قمت بإنشاء متغير جديد هو الذي سنقوم بإرجاعه int i, j, r, c; String su, x1, x2, str; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { su = s[i][j]; // قمت بتغير هذا السطر x1 = su.substring (0, 1); x2 = su.substring (1, 2); r = Integer.parseInt (x1, 16); c = Integer.parseInt (x2, 16); //subByte process new_variable[i][j] = hexToByte(sbox[r][c]); // نستخدم المتغير الجديد System.out.println (new_variable); // نطبع المتغير الجديد } } return new_variable; } اقتباس
0 Hamada Sayed نشر 16 يوليو 2020 أرسل تقرير نشر 16 يوليو 2020 بتاريخ On 16/7/2020 at 17:00 قال Sameera Abubaker: //فقط نستبدل ال s[i][j]=sbox[r][c];//here the error s[i][j] should be in binary bt sbox[r][c] value in string //بال s[i][j]=javax.xml.bind.DatatypeConverter.parseHexBinary(sbox[r][c])[0]; أظهر المزيد 1 اقتباس
0 Sameera Abubaker نشر 16 يوليو 2020 الكاتب أرسل تقرير نشر 16 يوليو 2020 بتاريخ On 16/7/2020 at 17:34 قال محمد ربيع زليول: أحتاج صراحة لجزء main وطريقة إستخدام الكود أيضًا، لكني قمت ببعض التغيرات هنا، لا أعلم أنها ستحل المشكلة أم لا. بما أنا sbox هو متغير من نوقع مصفوف String، قمت بتغير هذه دالة SubByte لتستقبل مصفوفة ثنائية الأبعاد من نوع String وليس Bytes. ثم قمت بإنشاء متغير جديد لنستطيع من خلاله إرجاع قيمة بنوع byte. قمت أيضًا بتغير نوع الدالة من void إلى byte from: public static void SubByte (byte[][] s) to: public static byte[][] SubByte (String[][] s) وبعض التغيرات الأخرى للتناسب مع التعديلات: from: su = Integer.toHexString(s[i][j]); to: su = s[i][j]; ------------ from: s[i][j]=sbox[r][c]; to: new_variable[i][j] = hexToByte(sbox[r][c]); لتصبح الدالة كالتالي: public static byte[][] SubByte (String[][] s) // قمت بتغير نوع هنا { System.out.println ("Inside subByte :"); byte[][] new_variable = new byte[16][16];// قمت بإنشاء متغير جديد هو الذي سنقوم بإرجاعه int i, j, r, c; String su, x1, x2, str; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { su = s[i][j]; // قمت بتغير هذا السطر x1 = su.substring (0, 1); x2 = su.substring (1, 2); r = Integer.parseInt (x1, 16); c = Integer.parseInt (x2, 16); //subByte process new_variable[i][j] = hexToByte(sbox[r][c]); // نستخدم المتغير الجديد System.out.println (new_variable); // نطبع المتغير الجديد } } return new_variable; } أظهر المزيد تعديل جميل ولكن الدالة يجب ان يمرر لها matrix من نوع byte لانه المتغيير يكون كذلك في الmain ويمر بعدة دوال على هذه الحالة بتاريخ On 16/7/2020 at 17:42 قال Hamada Sayed: أظهر المزيد تعديل جميل ولكن تكمن المشكلة في حجم العنصر في ال matrix حيث اصبح عنصر كبير مثل ما اشرت في صورة المخرجات حيث من المفترض ان يكون العنصر a1 وليس ffffffa1 اقتباس
0 Hamada Sayed نشر 16 يوليو 2020 أرسل تقرير نشر 16 يوليو 2020 بتاريخ On 16/7/2020 at 17:00 قال Sameera Abubaker: // بدل من Integer.toHexString(s[i][j]); //نستخدم String.format("%02x", s[i][j]); أظهر المزيد اقتباس
0 Sameera Abubaker نشر 16 يوليو 2020 الكاتب أرسل تقرير نشر 16 يوليو 2020 System.out.print(sbox[r][c]+" "); عند طباعة هذا الكود ظهر الناتج بالشكل المطلوب وهو كالتالي Inside subByte: ولكن للاسف لم اجد طريقة لتحويل النص الى بايت لان كل الطرق تؤدي الى byte array وبالتالي يتم وضع خانات لايجب ظهورها اقتباس
0 Hamada Sayed نشر 17 يوليو 2020 أرسل تقرير نشر 17 يوليو 2020 بتاريخ On 16/7/2020 at 19:47 قال Sameera Abubaker: ولكن للاسف لم اجد طريقة لتحويل النص الى بايت لان كل الطرق تؤدي الى byte array وبالتالي يتم وضع خانات لايجب ظهورها أظهر المزيد للتحويل من نص سداسي عشر الي بايت byte b1=(byte)Long.parseLong("a1", 16); byte b2=(byte)Integer.parseInt("a1", 16); byte b3=(byte)Short.parseShort("a1", 16); byte b4=(byte)DatatypeConverter.parseHexBinary("a1")[0]; للتحويل من بايت الي نص سداسي عشر String h1=Integer.toHexString(Byte.toUnsignedInt((byte)0xa1)); String h2=String.format("%02x", 0xa1); 1 اقتباس
0 Hamada Sayed نشر 17 يوليو 2020 أرسل تقرير نشر 17 يوليو 2020 بتاريخ On 16/7/2020 at 16:52 قال Sameera Abubaker: المشكلة هي ان النتيجة صارت byte array وليست byte أظهر المزيد السبب في ذالك هو تمرير متغير من byte لميثود تستقبل متغير من int ولحل المشكله دي نقوم بتحويل الbyte الي int بتاريخ On 17/7/2020 at 07:27 قال Hamada Sayed: byte val=(byte)0xa1; String hex1=Integer.toHexString(Byte.toUnsignedInt(val)); // or int byte2int=val&255; String hex2=Integer.toHexString(byte2int); أظهر المزيد اقتباس
0 Sameera Abubaker نشر 17 يوليو 2020 الكاتب أرسل تقرير نشر 17 يوليو 2020 بتاريخ On 17/7/2020 at 07:27 قال Hamada Sayed: للتحويل من نص سداسي عشر الي بايت byte b1=(byte)Long.parseLong("a1", 16); byte b2=(byte)Integer.parseInt("a1", 16); byte b3=(byte)Short.parseShort("a1", 16); byte b4=(byte)DatatypeConverter.parseHexBinary("a1")[0]; للتحويل من بايت الي نص سداسي عشر String h1=Integer.toHexString(Byte.toUnsignedInt((byte)0xa1)); String h2=String.format("%02x", 0xa1); أظهر المزيد لقد عدلت نوع المصفوفة sbox الى byte فصارت المخرجات احسن من السابق والffffffff تظهر قبل الرقم في القيم السالبة ساحاول تطبيق التعديل الذي اقترحته حضرتك وان شاء الله يضبط وشكرا اقتباس
السؤال
Sameera Abubaker
لدي قيمة نصية في متغير يحوي رقم بالنظام السادس عشر مثلا :
Str="1A"
وارغب في وضع هذه القيمة في متغير من نوع byte وليس byte array
فارجو افادتي في ذلك بلغة الجافا وشكر
16 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.