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

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

Sameera Abubaker

السؤال

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

Str="1A"

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

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

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

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

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 3 دقائق مضت قال Sameera Abubaker:

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

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

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 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
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 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];

 

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...