PDA

View Full Version : تبدیل باینری به استرینگ



bpzone
شنبه 23 مرداد 1389, 12:27 عصر
با سلام
من 2 تا رشته دارم که می خوام با هم XOR کنم
اول اون تا Srting رو به Byte تبدیل کردم
بعد Byte رو به BitArray و بعد XOR کردم
حالا چجوری نوع BitArray رو به Byte یا string تبدیل کنم

این کدی هست که نوشتم


static string XOR(string a, string b)
{
#region Var

byte[] a1 = new byte[100];
byte[] a2 = new byte[100];
string result = string.Empty;

#endregion


a1 = Encoding.ASCII.GetBytes(a);
a2 = Encoding.ASCII.GetBytes(b);

System.Collections.BitArray First = new System.Collections.BitArray(a1);
System.Collections.BitArray Second = new System.Collections.BitArray(a2);
First.Xor(Second);

//Convert First to Byte[] or string

return result;
}
چی پیشنهادی دوستان دارن ؟!

Salar Ashgi
شنبه 23 مرداد 1389, 12:37 عصر
میتونید خودتون یه متود ساده واسه Xor کردن بنویسید :



string myXor(string s1, string s2)
{
string res = "";
for (int i = 0; i < s1.Length; i++)
{
if (!s1[i].Equals(s2[i]))
res += "1";
else
res += "0";
}
return res;
}


نحوه استفاده :



MessageBox.Show(myXor("1100","0101"));


خروجی : 1001

موفق باشید ./

bpzone
شنبه 23 مرداد 1389, 12:53 عصر
میتونید خودتون یه متود ساده واسه Xor کردن بنویسید :



string myXor(string s1, string s2)
{
string res = "";
for (int i = 0; i < s1.Length; i++)
{
if (!s1[i].Equals(s2[i]))
res += "1";
else
res += "0";
}
return res;
}
نحوه استفاده :



MessageBox.Show(myXor("1100","0101"));
خروجی : 1001

موفق باشید ./

دوست عزیز
مشکل اینجا هست که رشته های که قصد XOR کردنشون رو دارم باینری نیستن
فرض کنید که 2 تا متن هست
من باید اول اونا رو بتونم به باینری تبدیل کنم
و بعد اونا رو XOR کنم
و مجدداً اون اطلاعات بدست اومده رو تبدیل کنم به رشته ...

Salar Ashgi
شنبه 23 مرداد 1389, 13:50 عصر
2 تا متن هست


منظورتون از متن ، مبنای ده هستش ؟!

bpzone
شنبه 23 مرداد 1389, 13:56 عصر
بله
2 تا متن هست
که اول کد اسکی حروف رو بدست میارم
و بعد ادامه کار ...

Salar Ashgi
شنبه 23 مرداد 1389, 17:18 عصر
دوست عزیز منظور خودتون رو واضحتر مطرح کنید ! شما رشته ها تون بشکل حروف هستند یا اعداد در مبنای
10 ؟

mohsen_csharp
شنبه 23 مرداد 1389, 17:49 عصر
این نمونه کد


private string XOR(string a, string b)
{
byte[] a1 = new byte[100];
byte[] a2 = new byte[100];
string result = string.Empty;
a1 = Encoding.ASCII.GetBytes(a);
a2 = Encoding.ASCII.GetBytes(b);
System.Collections.BitArray First = new System.Collections.BitArray(a1);
System.Collections.BitArray Second = new System.Collections.BitArray(a2);
System.Collections.BitArray resultBits;
resultBits=First.Xor(Second);
byte[] byteValue = this.ToByteArray(resultBits);
foreach (byte item in byteValue)
{
result += ((char)item).ToString();
}
return result;
}
private byte[] ToByteArray(BitArray bits)
{
int numBytes = bits.Count / 8;
if (bits.Count % 8 != 0) numBytes++;
byte[] bytes = new byte[numBytes];
int byteIndex = 0, bitIndex = 0;
for (int i = 0; i < bits.Count; i++)
{
if (bits[i])
bytes[byteIndex] |= (byte)(1 << (7 - bitIndex));
bitIndex++;
if (bitIndex == 8)
{
bitIndex = 0;
byteIndex++;
}
}
return bytes;
}

ولی کلا تبدیل به رشته معنا ندارد

bpzone
یک شنبه 24 مرداد 1389, 08:20 صبح
من در نهایت به این تابع رسیدم



static string XOR(string a, string b)
{
#region Var

int tmp = 0;
byte[] a1 = new byte[8];
byte[] a2 = new byte[8];
string result = string.Empty;

#endregion

#region XOR

a1 = Encoding.ASCII.GetBytes(a);
a2 = Encoding.ASCII.GetBytes(b);

System.Collections.BitArray First = new System.Collections.BitArray(a1);
System.Collections.BitArray Second = new System.Collections.BitArray(a2);
First.Xor(Second);

#endregion

#region Convert To Srting
for (int i = 0, j = 7, k = 0; i < 64; i++, j--)
{
if (First[i])
{
tmp += (2 ^ j);
Console.Write("1");
}
else
{
Console.Write("0");
}

if (j == 0)
{
j = 8;
a1[k] = (byte)tmp;
k++;
tmp = 0;
}
}
#endregion

return Encoding.ASCII.GetString(a1);
}

rahnama66
سه شنبه 20 فروردین 1392, 15:37 عصر
وقت بخیر خدمت دوستان
یک سوال دارم که فکر کنم بهتر است اینچا مطرح کنم
من میخواهم یک رشته از ورودی بگیرم مانند "Ali" و بعد کد هر حرف رو دونه به دونه ببینم مثلا ۱۰۰۱۱۱۰۱ ۱۱۰۰۱۱۰۱ ۱۰۱۰۱۱۱۱ با چه خط کد میتونم مقدار باینری هر حرف رو ببینم؟
حالا میخوام هر کدوم از این مقادیر رو تغییر بدم در مبنای ۲ یا XOR کنم و بعد خروجی بگیرم اما اینبار میخوام خروجی بهم رشته برگردونه مثلا "!rX" . جایی تو این انجمن مطرح شده؟ با رفرنسی که بتونم بهش مراجعه کنم؟
با تشکر

tooraj_azizi_1035
سه شنبه 20 فروردین 1392, 15:52 عصر
byte[] buffer1 = new byte[] {0x1, 0x23, 0x11, 0xF5};
byte[] buffer2 = new byte[] {0xA, 0x17, 0xB7, 0xC3};
byte[] resultBuffer = new byte[buffer1.Length];

for( int i = 0; i < buffer2.Length; i++ )
{
resultBuffer[i] = (byte) (buffer1[i] ^ buffer2[i]);
}

tooraj_azizi_1035
سه شنبه 20 فروردین 1392, 16:00 عصر
در مورد سوال rahnama66:
تابع تبدیل عدد تابع باینری:

using System;

class Program
{
static void Main()
{
// Write full binary string for 100.
Console.WriteLine(GetIntBinaryString(100));

// Write full binary string for 100000.
Console.WriteLine(GetIntBinaryString(100000));
}

static string GetIntBinaryString(int n)
{
char[] b = new char[32];
int pos = 31;
int i = 0;

while (i < 32)
{
if ((n & (1 << i)) != 0)
{
b[pos] = '1';
}
else
{
b[pos] = '0';
}
pos--;
i++;
}
return new string(b);
}
}

Output

00000000000000000000000001100100
00000000000000011000011010100000



با این خط رشته رو به کاراکتر بشکون:


// Input string.
string value = "Dot Net Perls";
// Use ToCharArray to convert string to array.
char[] array = value.ToCharArray();


بعد مقدار عددی هر کاراکتر رو پاس بده به تابع بالا:

byte b=(byte) ch;