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 بتاريخ 1 ساعة قال محمد ربيع زليول: في البداية سنقوم بتحويل كل حرف في النظام السادس عشر 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 بتاريخ 22 دقائق مضت قال 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 بتاريخ 3 دقائق مضت قال Sameera Abubaker: احاول العمل على خوارزمية SubByte ولكن الى الان المشكلة في اختلاف انواع المتغيرات ما هي المشكلة بالضبط؟ اقتباس
0 Sameera Abubaker نشر 16 يوليو 2020 الكاتب أرسل تقرير نشر 16 يوليو 2020 بتاريخ 3 دقائق مضت قال محمد ربيع زليول: ما هي المشكلة بالضبط؟ المشكلة هي ان النتيجة صارت byte array وليست byte اقتباس
0 محمد ربيع زليول نشر 16 يوليو 2020 أرسل تقرير نشر 16 يوليو 2020 بتاريخ الآن قال 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 بتاريخ 22 دقائق مضت قال 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 بتاريخ 33 دقائق مضت قال 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 بتاريخ 44 دقائق مضت قال محمد ربيع زليول: أحتاج صراحة لجزء 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 ويمر بعدة دوال على هذه الحالة بتاريخ 39 دقائق مضت قال Hamada Sayed: تعديل جميل ولكن تكمن المشكلة في حجم العنصر في ال matrix حيث اصبح عنصر كبير مثل ما اشرت في صورة المخرجات حيث من المفترض ان يكون العنصر a1 وليس ffffffa1 اقتباس
0 Hamada Sayed نشر 16 يوليو 2020 أرسل تقرير نشر 16 يوليو 2020 بتاريخ 2 ساعات قال 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 بتاريخ 11 ساعات قال 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 بتاريخ 20 ساعات قال Sameera Abubaker: المشكلة هي ان النتيجة صارت byte array وليست byte السبب في ذالك هو تمرير متغير من byte لميثود تستقبل متغير من int ولحل المشكله دي نقوم بتحويل الbyte الي int بتاريخ 6 ساعات قال 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 بتاريخ 6 ساعات قال 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
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.