اذهب إلى المحتوى

السؤال

Recommended Posts

  • 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 );
        
	}
}

يمكنك تجربة المثال على الرابط التالي.

  • 0
نشر
بتاريخ 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
نشر (معدل)
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 

 

تم التعديل في بواسطة Sameera Abubaker
  • 0
نشر
بتاريخ 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
نشر
بتاريخ 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  حيث اصبح عنصر كبير مثل ما اشرت في صورة المخرجات output.jpg.4287b0428e8d86dcccfe10e5aebca6bd.jpg

 

حيث من المفترض ان يكون العنصر a1  وليس ffffffa1

  • 0
نشر
System.out.print(sbox[r][c]+" ");

عند طباعة هذا الكود ظهر الناتج بالشكل المطلوب وهو كالتالي  Inside subByte: 

5f10ae1d2c139_wantedoutput.jpg.3c4972adf30a6f2bd185dc8a2f7d4522.jpg

ولكن للاسف لم اجد طريقة لتحويل النص الى بايت لان كل الطرق تؤدي الى byte array  وبالتالي يتم وضع خانات لايجب ظهورها :(

 

  • 0
نشر
بتاريخ 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);

 

  • 0
نشر
بتاريخ 20 ساعات قال Sameera Abubaker:

المشكلة هي ان النتيجة صارت  byte array وليست byte

 

output.jpg

 

السبب في ذالك هو تمرير متغير من 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
نشر
بتاريخ 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 تظهر قبل الرقم في القيم السالبة ساحاول تطبيق التعديل الذي اقترحته حضرتك وان شاء الله يضبط 

وشكرا

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...