PDA

View Full Version : سوال: حالت 0-1 داده ها



s.a.s.a.n
دوشنبه 21 مهر 1393, 12:21 عصر
سلام به همه . چند وقت پیش یه سوالی داشتم که چطور میشه داده در حالت باینری رو بدست آورد یعنی اینکه اگه یه فیلم 2گیگابایتی دارم اون 2 گیگ رو در حالت 0-1 میخوام .
یکی از دوستان راهنماییم کرد وتوضیح داد که چطور بایت های فایل رو دربیارم و با کد زیر اون بایت ها رو به بیت تبدیل کنم :


byte[] FileBytes;
string FileBits = "";


for (int i = 0; i < FileBytes.Length; i++)
{
FileBits += Convert.ToString(FileBytes[i], 2);
}

ولی مشکل اینه که تبدیل این بایت ها به بیت برا یه فایل 3 مگابایتی چند ساعت طول میکشه . میشه یه روش بهینه یادم بدین ؟
خیلی ممنون

Rejnev
دوشنبه 21 مهر 1393, 14:40 عصر
ضمن این که این کد و بعلاوه مساوی کردن رشته با یک مقدار جدید فاجعه ست، بگین که سه گیگا دیتا رو تبدیل کردی میخوای باهاش چیکار کنی؟ نمایشش بدی؟ فکر رم رو هم کردی؟ به فکر مدیریت حافظه بودی؟
به هر حال، نمیدونم چطوری میخوای مدیریتش کنی، ولی توصیه من استفاده از StringBuilder و استفاده از متد Append اون هست. بجای +=

StringBuilder sb=new StringBuilder();
for(int i=0; i<100000; i++)
{
sb.Append("aaaaaaaaaaaaaaaaaa");
}
String result=sb.ToString();

Mahmoud.Afrad
دوشنبه 21 مهر 1393, 19:23 عصر
نمیدونیم هدفتون چیه(که اگر بدونیم راه بهتر رو پیشنهاد میکنیم) ولی باید بدونید این که گفته میشه اطلاعات به صورت صفر و یک ذخیره میشن یک استعاره هست. حتی خود عددهای 0 و 1 هم به صورت باینری ذخیره میشن. تنها دلیلی که من متصور هستم اینه که بخواهید یک نمایش از بیتها داشته باشید و اگر جز این هست بیان کنید.

elec60
دوشنبه 21 مهر 1393, 21:13 عصر
در کد ;( FileBits += Convert.ToString(FileBytes[i], 2
هر بار که مقدار جدیدی به FileBites اضافه میشه به دلیل Immutable بودن کلاس string یک شی جدید در Heap ایجاد میشود و شئ قبلی در زمانی که توسط GC (آشغال جمع کن) تعیین میشه، از حافظه پاک میشه.
همونطور که دوستمون Rejnev گفتن کلا بهتره جاهایی که تغییرات روی string زیاد انجام میشه بجای string از StringBuilder استفاده کنیم.

s.a.s.a.n
پنج شنبه 24 مهر 1393, 10:11 صبح
ممنون از جواب هاتون و ببخشید که دیر تونستم بررسی کنم . این کدی که نوشتم صرفا یه مثال بود که از string استفاده میکردم . برای من نوع داده مهم نیست . فقط روشی میخوام که این 0 و 1 ها رو زود به دست بیارم . خیلی ممنون

s.a.s.a.n
پنج شنبه 24 مهر 1393, 10:12 صبح
نمیدونیم هدفتون چیه(که اگر بدونیم راه بهتر رو پیشنهاد میکنیم) ولی باید بدونید این که گفته میشه اطلاعات به صورت صفر و یک ذخیره میشن یک استعاره هست. حتی خود عددهای 0 و 1 هم به صورت باینری ذخیره میشن. تنها دلیلی که من متصور هستم اینه که بخواهید یک نمایش از بیتها داشته باشید و اگر جز این هست بیان کنید.

نه هدف من اصلا صرفا تبدیل به string نیست . من فقط به اون 0 و 1 ها نیاز دارم تا روی اونها یه عملیاتی رو انجام بدم حالا چه در قالب آرایه ای از boolian ها یا یه string طولانی یا هر روشی که سریع تر بتونم بهش دسترسی داشته باشم . فقط دنبال راهی برای زود رسیدن به این 0و 1 ها میگردم . خیلی ممنون

s.a.s.a.n
پنج شنبه 24 مهر 1393, 10:33 صبح
ضمن این که این کد و بعلاوه مساوی کردن رشته با یک مقدار جدید فاجعه ست، بگین که سه گیگا دیتا رو تبدیل کردی میخوای باهاش چیکار کنی؟ نمایشش بدی؟ فکر رم رو هم کردی؟ به فکر مدیریت حافظه بودی؟
به هر حال، نمیدونم چطوری میخوای مدیریتش کنی، ولی توصیه من استفاده از StringBuilder و استفاده از متد Append اون هست. بجای +=

StringBuilder sb=new StringBuilder();
for(int i=0; i<100000; i++)
{
sb.Append("aaaaaaaaaaaaaaaaaa");
}
String result=sb.ToString();



تقریبا قسمت بزرگی از مشکلم با این روش حل شد خیلی ممنون . حالا اگه یه راهی پیدا هم باشه این داده ها رو از string به یه حالتی در بیارم که کمتر حافظه رو اشغال کنه خیلی بهتر میشه . چون نا سلامتی اینا بیت هستن دیگه :) لازم که نیست مثل string باهاشون رفتار کنم و حافظه اشغال کنم

hamid_hr
پنج شنبه 24 مهر 1393, 10:36 صبح
http://www.dotnetperls.com/binaryreader
http://msdn.microsoft.com/en-us/library/system.io.binaryreader(v=vs.110).aspx

s.a.s.a.n
پنج شنبه 24 مهر 1393, 10:40 صبح
http://www.dotnetperls.com/binaryreader
http://msdn.microsoft.com/en-us/library/system.io.binaryreader(v=vs.110).aspx

ممنون بابت راهنمایی ولی این byte ها رو میده نه bit ها رو .

hamid_hr
پنج شنبه 24 مهر 1393, 10:45 صبح
شما اینطوری میتونی بیت به بیت بخونی فک کنم


BinaryReader b = new BinaryReader(File.Open("file.bin", FileMode.Open));
bool bl = b.ReadBoolean();

مهرداد صفا
پنج شنبه 24 مهر 1393, 13:56 عصر
با سلام.
دوست من اگر قصد کد گذاری و یا به نوعی ناخوانا کردن فایل رو دارید باید بگم که راه اشتباه رو انتخاب کردید، شما باید پردازشتون رو روی بایتها انجام بدید و نه بیتها.
در هر حال با این روش میتونید آرایه ای از بایتها رو به لیستی از بیت تبدیل کنید که ظاهرا باید سریعتر و کم حجمتر از روش قبلی باشه (البته باید امتحان بشه):


var bits =new System.Collections.BitArray(System.IO.File.ReadAll Bytes("myfile"));


به ازای 0 مقدار false و true رو به ازای 1 خواهید داشت.