PDA

View Full Version : تبدیل یک تابع کد سی شارپ به php



shahryari
سه شنبه 22 دی 1394, 11:45 صبح
سلام دوستان

من هرکاری کردم نتونستم کد زیر را که به زبان سی شارپه رو php تبدیل کنم
در اصل کار این تابع گرفتن متن از یک فایل و تبدیل اون به آرایه بایت و نوشتن مجدد اون در یک فایل دیگه است

کد سیشارپ
private void writeToFile(string filename)
{
string s = System.IO.File.ReadAllText(filename);
byte[] b = System.Text.Encoding.Default.GetBytes(s);
System.IO.File.WriteAllBytes("test.gnm", b);
}

Unique
سه شنبه 22 دی 1394, 14:02 عصر
این تابع که یک کپی معمولیه:


function writeToFile($filename){
copy($filename,"test.gnm");
}


function writeToFile($filename){
$fsrc = fopen($filename,'r');
$fdest = fopen("test.gnm",'w+');
stream_copy_to_stream($fsrc,$fdest);
fclose($fsrc);
fclose($fdest);
}

function writeToFile($filename){
file_put_contents("test.gnm",file_get_contents($filename));
}

shahryari
سه شنبه 22 دی 1394, 17:18 عصر
باتشکر از حسن توجه شما دوست عزیز
هیچ کدومش کار نکرد متاسفانه
عنایت داشه باشید که متن موجود در یک فایل رو میگیریم و سپس به آرایه بایت تبدیل میکنیم و و بایت ها رو در قالب یک فایل باینری ذخیره میکنیم

Unique
چهارشنبه 23 دی 1394, 23:25 عصر
هیچ کدومش کار نکرد متاسفانه
چطور با این اطمینان میگین !؟ چه خطایی میگیرین ؟
هر سه به درستی کار میکنه ! شما توی چه محیطی اجراش میکنین ؟!
عنایت داشته باشین کد شما لقمه را خیلی پیچونده و برای کپی کردن فایل نیاز به این کارها نیست ! مگه اینکه مقصود آموزش باشه.

0xEHSAN
پنج شنبه 24 دی 1394, 01:11 صبح
درود کدها درست هستن اگه میشه کدتون رو بذارید و یا اینکه این کد رو بعد هر تابعی که فراخوانی میکنید بذارید



error_reporting(E_ALL ^ E_NOTICE);
$err = error_get_last();
print_r($err);

0xEHSAN
پنج شنبه 24 دی 1394, 01:14 صبح
خط اول رو بذارید اولین دستور بعد از دستور دومی و سومی برای دریافت خطا استفاده کنید احتمالا سطح دسترسی پایینه

shahryari
پنج شنبه 24 دی 1394, 12:17 عصر
چطور با این اطمینان میگین !؟ چه خطایی میگیرین ؟ هر سه به درستی کار میکنه ! شما توی چه محیطی اجراش میکنین ؟! عنایت داشته باشین کد شما لقمه را خیلی پیچونده و برای کپی کردن فایل نیاز به این کارها نیست ! مگه اینکه مقصود آموزش باشه.
با تشکر مجدد از شما دوست گرامی
هدف بنده کپی یک فایل نیست و نمیگم خطا داره
هدف اینه که یک متنی داخل یک فایل متنی است این فایل در حالت عادی دقیقا مانند یک فایل txt هست
اگر ما با کد سشارپ متن رو بگیریم و به تبدیل به ارایه ای از بایت ها کنیم، ماهیت فایل یک فایل باینری قابل فهم برای ویندوز هست (مثل یک تصویر یا pdf و ...)
یک نمونه فایل متنی را براتون اپلود کردم با کد سیشارپ تبدیل به یک عکس میشه!!!
دقت!! : با تغییر پسوندها راه بجایی نمیبرید

0xEHSAN
پنج شنبه 24 دی 1394, 14:59 عصر
درود آیا قالب فایل تصویر رو رعایت کردید؟ نوشته هاتونو دقیقا کجای تصویر پیاده کردید؟البته نوشته رو میشه به باینری تزریق کرد اما برعکس احتمال خطاش زیاده و ضمنن بعضی از کارکترها رو پشتیبانی نمیکنه برای مثال وقتی به کارکتر صفر در باینری برسه نوشتن رو متوقف میکنه کارکتر صفر یعنی پایان رشته

Unique
پنج شنبه 24 دی 1394, 17:24 عصر
جناب شهریاری ، قبل از اینکه پاسخ شما را بدم راستش دو تا موضوع :

۱ - بهتره توی چنین شرایطی توضیح بدین این Data داره از کجا میاد و شما دارین چه کاری انجام میدین که به این مشکل خوردین. اینطوری من و دوستان راحت تر متوجه میشیم مشکل از کجاست !
۲ - هیچوقت از System.Text.Encoding.Default استفاده نکنین چون از سیستم به سیستم فرق میکنه و من خیلی شانسی متوجه شدم Encoding تبدیلی چیه !!

اما جواب شما :
فایل شما UTF-8 هست و به همین خاطر سیستم ها تشخیص نمیدن که PNG هست و کلا از فرمت PNG در میاد ، احتمالا دارین خروجی خام عکس از سرویس دهنده را با UTF-8 چاپ میکیند و مقدار را ذخیره میکنید. البتخه احتمالا و برام جالبه چه بلایی سر اصل فایل میارین که اینطور میشه ! اما اگه میخواین با PHP به فرمت png برش گردونین :

file_put_contents("araz.png",iconv("UTF-8","CP1256",file_get_contents("araz.txt")));


دقت!! : با تغییر پسوندها راه بجایی نمیبرید
پسوند ها فقط توی ویندوز اهمیت دارن و توی لینوکس و مک اصلا به حساب نمیان.

shahryari
پنج شنبه 24 دی 1394, 19:45 عصر
با تشکر از شما دوست گرامی و ممنون بخاطر اینکه وقت گذاشتید
با این حساب من با مشکلی روبرو هستم و اونم گرفتن انکودینگ فایله
که فعلا با روش زیر و کد شما حل شد اما CP1256 در همه فایل ها یکسان است؟

$encoding = mb_detect_encoding(file_get_contents("araz.txt"));
file_put_contents("araz.png", iconv($encoding,"CP1256",file_get_contents( "araz.txt")));

0xEHSAN
پنج شنبه 24 دی 1394, 20:27 عصر
درود نه فرق میکنن برای مثال این متن از اینجا شما بره تو بلاد چین باز بشه همش علامت سواله چونکه اینکدینگ فایل با اینکدینگ حاضر در اون سیستمش فرق میکنه اگه میخواید به این مشکلا بر نخورید با utf8 ذخیره کنید

Unique
جمعه 25 دی 1394, 04:57 صبح
با این حساب من با مشکلی روبرو هستم و اونم گرفتن انکودینگ فایله
که فعلا با روش زیر و کد شما حل شد اما CP1256 در همه فایل ها یکسان است؟

به نظرم بهتره توضیح بدی میخوای در اصل چه کاری انجام بدی !؟ راستش تا حالا نیاز نبوده این کار را انجام بدم و اینکه چند ساعت توش گیر کردم به خاطر نداشتن تجربه بود ! روی سرور چک کن و اگه جواب داد حله ! منظورم از سرور جایی هست که اون فایل text را ایجاد میکنی !

us1234
جمعه 25 دی 1394, 08:59 صبح
تجربه شخصی من اینه که هر وقت یک فایل که محتوای باینری دارد ( یا به قولی کلر تکس نیست ) را بخواهید در دیتابیس یا یک فایل کلرتکس ذخیره کنید بهتره آن فایل تبدیل به base64 شود.

یک نکته خیلی خوبی که این کار داره اینکه بدون دیکد به base64 میتونید عکس ها را نمایش دهید ...

Unique
جمعه 25 دی 1394, 20:57 عصر
البته base64 حجم فایل را خیلی بالا میبره و خیلی جا ها اصلا ارزش نداره !