• 0

كيفية التحويل string الى byte

لدي قيمة نصية في متغير يحوي رقم بالنظام السادس عشر مثلا :

Str="1A"

وارغب في وضع هذه القيمة في متغير من نوع byte وليس byte array 

فارجو افادتي في ذلك بلغة الجافا وشكر 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 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
بتاريخ 22 دقائق مضت قال Sameera Abubaker:

ماذا عن التحويل من نوع int  الى نوع byte ???

يمكن تعريف المتغير عن طريق class Integer ثم إستخدام دالة byteValue للحصول على قيمة byte

Integer x = new Integer(0xA1);
byte b = x.byteValue(); 

 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

شكرا ولكن الطريقتان لم تعطي القيمة المتوقعة .

احاول العمل على خوارزمية SubByte ولكن الى الان المشكلة في اختلاف انواع المتغيرات 

SubByte.jpg

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0
بتاريخ 3 دقائق مضت قال Sameera Abubaker:

احاول العمل على خوارزمية SubByte ولكن الى الان المشكلة في اختلاف انواع المتغيرات

ما هي المشكلة بالضبط؟

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0
بتاريخ 3 دقائق مضت قال محمد ربيع زليول:

ما هي المشكلة بالضبط؟

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

 

output.jpg

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0
بتاريخ الآن قال Sameera Abubaker:

المشكلة هي ان النتيجة صارت  byte array وليست 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
1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 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
بتاريخ 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
بتاريخ 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
بتاريخ 2 ساعات قال Sameera Abubaker:

// بدل من 
Integer.toHexString(s[i][j]);

//نستخدم
String.format("%02x", s[i][j]);

 

 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 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);

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


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

وشكرا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن