PDA

View Full Version : تعیین اندازه رشته



rasol_afkham
شنبه 16 فروردین 1393, 16:59 عصر
:متفکر:
چطور می توان اندازه کاراکترهای یک رشته را تعیین نمود. برای مثال من می خواهم متغیری از نوع رشته داشته باشم که تنها بتوان تا 30 کاراکتر را در آن ذخیره نمود و سپس آن را بر روی فایل ذخیره کرد. حال اگر در این متغیر رشته "رسول" قرار گیرد. این رشته 4 کاراکتر دارد، پس برنامه به جای 26 کاراکتر مابقی، 24 فاصله خالی را در فایل ذخیره کند. در ضمن رشته از نوع Unicode و یا UTF باشد. مثل کاری که بانکهای اطلاعاتی انجام می دهند. چون برنامه C# وقتی که رشته ای را در فایل ذخیره می کند، اگر کاراکترهای آن از نوع Unicode باشند برای هر کاراکتر 2 بایت در نظر می گیرد و اگر کد اسکی باشند 1 بایت. و اگر رشته مورد نظر ترکیبی از کاراکترهای اسکی و یونیکد باشد، برای کاراکترهای اسکی 1 بایت و کاراکترهای یونیکد 2 بایت را در نظر می گیرد.
برای مثال اگر رشته "رسول افخم" را بخواهیم در فایل ذخیره نماییم. این رشته 9 کاراکتر دارد.به اضافه کاراکتر تعیین کنند آخر رشته. یعنی جمعا 10 کاراکتر دارد. پس باید 20 بایت جا اشغال کند. ولی برنامه کاراکتر تعیین کننده آخر رشته را اسکی و همچنین فاصله خالی بین نام و نام خانوادگی را هم کاراکتر اسکی در نظر می گیرد و بقیه کاراکترها را یونیکد و جمعا برای این رشته 18 بایت فضا در فایل اشغال می شود.
(امیدوارم که سوال را صحیح گفته باشم). حالا چطور می توان تعیین نمود که همه کاراکترهای رشته را از نوع یونیکد و یا UTF در نظر گرفته و برای هر کاراکتر 2 بایت را در نظر بگیرد و یا برای هر کاراکتر 1 بایت را در نظر بگیرد؟

vahid-p
شنبه 16 فروردین 1393, 17:19 عصر
خب شما با یه شرط میتونید تعداد کاراکترهاتون رو محدود کنید. اگر منظورتون سایز بر حسب بایت باشه، خب اونوقت قضیه متفاوت است. به نظر من شما جدولتون رو بر اساس unicode مورد نظرتون ست کنید ( اینطوری حداکثر رو دارید ) حالا بیایید و فقط 30 کاراکتر ( نه 30 بایت ) رو بگیرید و در فیلدتون قرار بدین.

rahnema1
شنبه 16 فروردین 1393, 19:48 عصر
سلام
به عنوان مثال آرایه 30 تایی c را همون جور درست می کنیم و در یک فایل ذخیره می کنیم

string a = "رسول افخم";
IEnumerable<byte> b =new List<byte>();
byte[] c= new byte[30];
a.Select(xx=> b=b.Concat( BitConverter.GetBytes( BitConverter.ToUInt16( System.Text.Encoding.Unicode.GetBytes( xx.ToString()), 0)))).ToList();
b.ToArray() .CopyTo(c, c.Length-b.Count()-2);
System.IO.File.WriteAllBytes( "myfile.bin", c);

rasol_afkham
یک شنبه 17 فروردین 1393, 00:08 صبح
یه کم دیگه این کد رو توضیح می دی :متفکر:

hadi0x7c7
یک شنبه 17 فروردین 1393, 00:24 صبح
اینجا (http://stackoverflow.com/questions/4184190/c-unicode-to-string-conversion) جوابتون نبود؟؟

rahnema1
یک شنبه 17 فروردین 1393, 09:26 صبح
یه کم دیگه این کد رو توضیح می دی :متفکر:

چون شما گفتید مثلا برای اسپیس 1 بایت در نظر می گیره این کد را طولانی کردم فکر کردم مثلا unicode.getbytes مثلا در مورد اسپیس 1 بایت بر می گردونه در نتیجه اون را تبدیل به Uint16 کردم که بشه 2 بایت بعد بایتهای اون را استخراج کردم و با دستور concat بایتها را به هم چسبوندم آرایه c هم که یک آرایه بایت شامل صفر بود این آرایه جدید را طوری داخل اون کپی کردم که ( مطابق خواسته شما) دو بایت آخر برابر صفر بمونه
اگر چه این کد درست جواب میده ولی یه سری کار اضافی انجام میده چون unicode.getbytes برای هر کاراکتر 2 بایت بر می گردونه خواه اسپیس باشه خواه ascii و غیره که این یکی کوتاه تره

string a = "رسول افخم";
byte[] c= new byte[30];
System.Text.Encoding.Unicode.GetBytes(a).CopyTo(c, c.Length-a.length*2-2);
System.IO.File.WriteAllBytes( "myfile.bin", c);