PDA

مشاهده نسخه کامل : باز کردن یک فایل بصورت باینری و ویرایش کردن محتویات آن (ویژوال بیسیک)



Mostafa Khalili
شنبه 27 فروردین 1390, 08:10
دوستان من میخواستم بدونم چطوری میشه یه فایل رو حالا با هر پسوندی رو توی ویبی به صورت هگز باز کرد و بشه کد هگز مورد نظر رو در اون جستجو کرد و یه مقدار جدید جایگزینش کرد و در نهایتش سیوش کرد.
ممنون میشم اگر کسی سورسی یا کمکی میتونه بکنه چون در این ضمینه هیچ اطلاعی ندارم.

the_king
شنبه 27 فروردین 1390, 11:33
دوستان من میخواستم بدونم چطوری میشه یه فایل رو حالا با هر پسوندی رو توی ویبی به صورت هگز باز کرد و بشه کد هگز مورد نظر رو در اون جستجو کرد و یه مقدار جدید جایگزینش کرد و در نهایتش سیوش کرد.
ممنون میشم اگر کسی سورسی یا کمکی میتونه بکنه چون در این ضمینه هیچ اطلاعی ندارم.

نگید هگز، عبارت باینری صحیح تره، چون هگز صرفا یک مبنای عددی و یک شیوه نمایش داده است، اما باینری
علاوه بر اینکه یک مبنای عددی است، یک شیوه دسترسی به فایله، درست نقطه مقابل شیوه دسترسی متنی.

موقعی که یک فایل رو با دستور Open و در مد For Binary باز می کنید، بصورت باینری باز میشه :


Open "file.ext" For Binary As #1


و با فرمان Get از داخلش داده ها رو می خوانید :


Get #1, , Data


و با فرمان Put داده ها را داخلش می نویسید :


Put #1, , Data


و با فرمان Close فایل رو می بندید :


Close #1


مثلا برنامه زیر فایل file.ext رو باز می کنه، دنبال بایت های 00 می گرده و همه شون رو به FF تغییر می ده :


Dim Data() As Byte, Pos As Long, Length As Long
Open "file.ext" For Binary As #1
Length = LOF(1)
If Length > 0 Then
ReDim Data(0 To Length - 1)
Get #1, 1, Data
For Pos = 0 To Length - 1
If Data(Pos) = &H0 Then Data(Pos) = &HFF
Next
Put #1, 1, Data
End If
Close #1

Mostafa Khalili
شنبه 27 فروردین 1390, 11:48
ممنون دوست عزیز حالا یه سوال دیگه این روشی که شما گفتید هر فایلی رو که خواستیم باز میکنه؟؟ مثلا jpg یا exe و میشه داخلش تغیراتی به وجود آورد طبق همون روشی که گفتید؟

the_king
شنبه 27 فروردین 1390, 17:24
ممنون دوست عزیز حالا یه سوال دیگه این روشی که شما گفتید هر فایلی رو که خواستیم باز میکنه؟؟ مثلا jpg یا exe و میشه داخلش تغیراتی به وجود آورد طبق همون روشی که گفتید؟

بله، وقتی فایل رو بصورت باینری باز می کنید فایل رو یکسری داده ها خام در نظر می گیره و اینکه داخل فایل چی
قرار داره و فرمت فایل چیه اهمیتی نداره.

Mostafa Khalili
یکشنبه 28 فروردین 1390, 05:41
بسیار تا بسیار متشکر هیچ فکر نمیکردم این انجمن به این سرعت مشکلات یه نفرو برطرف کنه.
اگر اشکالی نداره یه سوال دیگه هم در این رابطه بپرسم.
شما فرض کنید ما دو تا فایل داریم.میخواییم فایل شماره یک رو باز کنیم و مثلا مقداری از کدهای باینری فایلی رو که باز کردیم مثلا 10 خطش رو با کل محتوای باینری فایل دو جابه جا کنیم در این صورت باید چیکار کرد.مثلا به برنامه بگیم شما از فایل یک از ابتدای فلان خط شروع کن به جستجو تا اخر فلان خط و کل محتوای باینری فایل دوم رو در جایگزین محتوای انتخاب شده فایل اولی بکن.
خودم فکر میکنم برای این کار باید از آدرسی دهی از طریق آفست انجام بشه.البته یه حدس بود ممنون میشم مثل قبل راهنماییم کنید.

the_king
یکشنبه 28 فروردین 1390, 14:22
بسیار تا بسیار متشکر هیچ فکر نمیکردم این انجمن به این سرعت مشکلات یه نفرو برطرف کنه.
اگر اشکالی نداره یه سوال دیگه هم در این رابطه بپرسم.
شما فرض کنید ما دو تا فایل داریم.میخواییم فایل شماره یک رو باز کنیم و مثلا مقداری از کدهای باینری فایلی رو که باز کردیم مثلا 10 خطش رو با کل محتوای باینری فایل دو جابه جا کنیم در این صورت باید چیکار کرد.مثلا به برنامه بگیم شما از فایل یک از ابتدای فلان خط شروع کن به جستجو تا اخر فلان خط و کل محتوای باینری فایل دوم رو در جایگزین محتوای انتخاب شده فایل اولی بکن.
خودم فکر میکنم برای این کار باید از آدرسی دهی از طریق آفست انجام بشه.البته یه حدس بود ممنون میشم مثل قبل راهنماییم کنید.

ابتدا به این نکته توجه کنید که در فایل باینری خط مفهوم خاصی نداره، خط و سطر مربوط به فایل های متنی هستند.
وقتی یک فایل باینری رو باز می کنید، هیچ پردازشی روی داده ها انجام نمیشه، واحد پردازش بایته، نه خط و سطر.
شما در فایل باینری باید بگید بایت چندم. برای اینکه بدانید سطر شماره n از کدوم بایت شروع میشه بایستی
داده های داخل فایل رو پیمایش کنید تا به کاراکتر های انتهای سطر (کاراکتر 13 و کاراکتر 10) برسید تا یک سطر تموم بشه.

به عنوان مثال کد زیر 100 بایت ابتدای از فایل first.ext رو با 100 بایت ابتدای فایل second.ext تعویض می کنه،
از فایل اول به فایل دوم منتقل میشه و از فایل دوم به فایل اول. داده ها این وسط از دست نمی روند و
طبیعتا اگه این برنامه رو دوباره اجرا کنید داده های داخل ایندو فایل به جای اولیه شون بر می گردند :


Dim Data1(0 To 99) As Byte, Data2(0 To 99) As Byte
Open "first.ext" For Binary As #1
Open "second.ext" For Binary As #2
Get #1, , Data1
Get #2, , Data2
Put #1, 1, Data2
Put #2, 1, Data1
Close #1
Close #2

دقت کنید که در دستورات Put پارامتر دوم روی 1 تنظیم شده، یعنی از بایت 1 ام به بعد بخوان و بنویس.
دلیلش این است که قبل از دستورات Put دستورات Get ای اجرا شده و موقعیت مکان نمای فایل ها
100 بایت به جلو حرکت کرده و دیگر ابتدای فایل نیست.

زمانی که از دستور Get یا Put استفاده می کنید موقعیت مکان نما در فایل به همان اندازه که می خوانید
یا می نویسید به سمت جلو حرکت می کنه، در نتیجه اگر می خواهید در همان مکان قبلی چیزی را بخوانید
یا نویسید یا باید با استفاده از دستور Seek به موقعیت قبلی برگردید و یا در دستورات Put و Get بعدی موقعیت
خواندن و نوشتن را مشخص کنید. در دستورات Get نیازی به این پارامتر 1 نبود، چون موقعیت مکان نما در
فایلی که تازه باز شده همان بایت 1 ام است.

اگر می خواهید بجای 100 بایت 10 سطر از فایل ها را بخوانید باید این مساله را هم در نظر بگیرید که 10 سطر
ممکن است در یک فایل 50 بایت باشد و در یک فایل دیگر 1000 بایت و جابجا کردن بین 50 بایت و 1000 بایت
نباید به داده های بعد از آنها آسیبی برساند، اگر مستقیما 1000 بایت را جایی قرار دهید که قبلا 50 بایت
قرار داشته، 950 بایتی که بعد از 50 بایت قرار داشته را نابود می کنید و اگر 50 بایت را جایی قرار دهید که
قبلا 1000 بایت قرار داشته، 950 بایت بعد از آن دست نخورده باقی می ماند.

برای جلوگیری از این اتفاق باید تمام داده های بعد از 10 سطر را هم بخوانید و بنویسید. کد زیر اینکار را به
درستی انجام می دهد، 10 سطر از فایل first.txt را با 10 سطر از فایل second.txt تعویض می کند.
فقط دقت کنید که قرار است محتویات فایل ها داده های متنی ASCII باشند :


Dim Data As String, Length As Long
Dim Lines1() As String, Lines2() As String
Dim Index As Long
Open "first.txt" For Binary As #1
Length = LOF(1)
If Length > 0 Then
Data = Space(Length)
Get #1, , Data
Else
Data = vbCrLf
End If
Lines1 = Split(Data, vbCrLf)
Close #1
Open "second.txt" For Binary As #2
Length = LOF(2)
If Length > 0 Then
Data = Space(Length)
Get #2, , Data
Else
Data = vbCrLf
End If
Lines2 = Split(Data, vbCrLf)
Close #2
Open "first.txt" For Output As #1
For Index = 0 To 9
If Index > UBound(Lines2) Then Exit For
Print #1, Lines2(Index)
Next
For Index = 10 To UBound(Lines1)
Print #1, Lines1(Index)
Next
Close #1
Open "second.txt" For Output As #2
For Index = 0 To 9
If Index > UBound(Lines1) Then Exit For
Print #2, Lines1(Index)
Next
For Index = 10 To UBound(Lines2)
Print #2, Lines2(Index)
Next
Close #1

Mostafa Khalili
یکشنبه 28 فروردین 1390, 18:24
بازم ممنون علی آقا میخواستم بدونم میشه مانند دستور اول یه حالت سرچ مانندی براش به وجود آورد که مثلا بگیم شما از فلان جا باید که اولش &h8562127 بخون تا زمانی که رسیدی به &h564f547 بعدش وقتی به آخرش رسید این بشه اون محدوده ما و اون محدوده رو هم که میخواییم جایگزین کنیم فکر کنم بهتر بششه بدستش اورد . چون اینجوری شاید یک فایل چندین و چند هزار بایت داشته باشه و اینجوری کار خیلی سخت میشه.

the_king
دوشنبه 29 فروردین 1390, 05:32
بازم ممنون علی آقا میخواستم بدونم میشه مانند دستور اول یه حالت سرچ مانندی براش به وجود آورد که مثلا بگیم شما از فلان جا باید که اولش &h8562127 بخون تا زمانی که رسیدی به &h564f547 بعدش وقتی به آخرش رسید این بشه اون محدوده ما و اون محدوده رو هم که میخواییم جایگزین کنیم فکر کنم بهتر بششه بدستش اورد . چون اینجوری شاید یک فایل چندین و چند هزار بایت داشته باشه و اینجوری کار خیلی سخت میشه.

اعدادی مثل H8562127& چهار بایتی (32 بیتی) هستند و موقع جستجو کردن هم باید از نوع داده 32 بیتی Long
استفاده کرد. فقط به این نکته توجه داشته باشید که وقتی 4 بایت 4 بایت داده ها رو پردازش می کنیم فرض رو بر
این قرار دادیم که داده ها 4 بایتی نوشته شده اند، یعنی داده مورد نظر ما در میان یکسری داده 32 بیتی
قرار گرفته و اگر از ابتدای فایل 4 بایت 4 بایت به جلو حرکت کنیم پیدایش می کنیم.

وگرنه ممکنه موردی که جستجو می کنیم وجود داشته باشه اما پیدا نشه. به عنوان مثال در داده های زیر داده
H11223344& هست اما اگر داده ها رو 32 بیتی پردازش کنیم بصورت قطعات 32 بیتی پردازش میشه و
بین دو داده 32 بیتی قرار می گیره میشه و پیدا نخواهد شد (داده ها در فایل برعکس نوشته می شوند) :


88991122 33445566 77889900


طبیعتا جستجوی 32 بیتی (چهار بایتی) سریعتر از جستجوی 8 بیتی (یک بایتی) است اما همانند مثال بالا ممکنه
موردی رو از دست بدهیم. در مثال زیر در فایل file.ext دنبال داده H11223344& می گردیم و اگر پیدا شد، متغیر
Start موقعیت آن در فایل را بر حسب بایت مشخص می کند، این جستجو فقط زمانی موثر است که داده ها
32 بیتی ذخیره شده باشند :


Dim Data As Long, Start As Long
Open "file.ext" For Binary As #1
Do While Loc(1) + 4 <= LOF(1)
Get #1, , Data
If Data = &H11223344 Then
Start = Loc(1) - 4
Exit Do
End If
Loop
Close #1


می توانیم همینکار را با جستجوی 8 بیتی (یک بایتی) انجام دهیم که طبیعتا کندتر است چون هر بایتی چهار بار
جستجو می شود، اما مزیت این شیوه در این است که هیچ موردی را از قلم نمی اندازد :


Dim Data As Long, Start As Long, Length As Long, Pos As Long
Open "file.ext" For Binary As #1
Length = LOF(1)
For Pos = 1 To Length - 3
Get #1, Pos, Data
If Data = &H11223344 Then
Start = Pos
Exit For
End If
Next
Close #1


حالا شما می توانید این جستجو را دوبار انجام دهید، یکبار دنبال نقطه شروع بگردید و یکبار دنبال نقطه پایان
و سپس داده های بین ایندو را بخوانید و بنویسید.

Mostafa Khalili
دوشنبه 29 فروردین 1390, 05:58
دستتون درد نکنه.
بحث خیلی جالبی شده واسه من که برای اولین بار دارم با باینری کار میکنم و چیزای خوبی از شما یاد گرفتم ولی طبیعاتا چون بار اولمه دارم آخراش قاطی میکنم.
من یه فایل ضمیمه کردم با فرمت EEC حالا میخوام یه محدوده از dfb8c35d تا 7f06f9a7 که در این فایل موجوده محدوده ما قرار بگیره و ما به جای این محدوده یه مقادیر دیگری از هر فایلی که خواستی رو جایگزینش کنید.ممنون میشم سورس رو برای این بنویسید چون فکر کنم بهتر موضوع رو درک کنم.

the_king
دوشنبه 29 فروردین 1390, 08:04
دستتون درد نکنه.
بحث خیلی جالبی شده واسه من که برای اولین بار دارم با باینری کار میکنم و چیزای خوبی از شما یاد گرفتم ولی طبیعاتا چون بار اولمه دارم آخراش قاطی میکنم.
من یه فایل ضمیمه کردم با فرمت EEC حالا میخوام یه محدوده از dfb8c35d تا 7f06f9a7 که در این فایل موجوده محدوده ما قرار بگیره و ما به جای این محدوده یه مقادیر دیگری از هر فایلی که خواستی رو جایگزینش کنید.ممنون میشم سورس رو برای این بنویسید چون فکر کنم بهتر موضوع رو درک کنم.

به این مساله توجه کنید که اعداد 32 بیتی در حافظه بصورت بایت های معکوس نوشته می شوند، مثلا عدد H12345678&
به صورت بایت های متوالی زیر نوشته می شود :


78 56 34 12

بنابر این اگر می خواهید دنبال بایت های متوالی DF B8 C3 5D بگردید باید دنبال مقدار H5DC3B8DF& بگردید، نه
مقدار HDFB8C35D&

برای ساده تر شدن کد چند تابع می سازیم :

تابع ReadData از داخل فایل داده ها را به طول درخواستی خوانده و بر می گرداند.
پارامتر اول فایل است که با شماره های 1 و 2 و ... مشخص می کنیم، پارامتر دوم Start موقعیت شروع خواندن است و
پارامتر سوم طول داده درخواستی بر حسب بایت است :


Private Function ReadData(ByVal File As Integer, ByVal Start As Long, ByVal Length As Long) As Byte()
Dim Data() As Byte, Pos As Long
Pos = Seek(File)
ReDim Data(0 To Length - 1)
Get File, Start, Data
Seek File, Pos
ReadData = Data
End Function


تابع WriteData را برای نوشتن داده ها در فایل تعریف می کنیم.
پارامتر اول فایل است که با شماره های 1 و 2 و ... مشخص می کنیم، پارامتر دوم Start موقعیت شروع نوشتن است و
پارامتر سوم داده ای است که باید نوشته شود :


Private Sub WriteData(ByVal File As Integer, ByVal Start As Long, ByRef Data() As Byte)
Dim Pos As Long
Pos = Seek(File)
Put File, Start, Data
Seek File, Pos
End Sub


یک تابع به نام FindDataLong هم ایجاد می کنیم که در فایل دنبال یک داده 32 بیتی Long بگردد و موقعیت
آنرا برگرداند، جستجو 8 بیتی است و هیچ موردی را از قلم نمی اندازد.
پارامتر اول فایل است که با شماره های 1 و 2 و ... مشخص می کنیم، پارامتر دوم Start موقعیت شروع جستجو است
و پارامتر سوم داده ای است که باید جستجو شود :


Private Function FindDataLong(ByVal File As Integer, ByVal Start As Long, ByVal Data As Long) As Long
Dim Buffer As Long, Length As Long, Pos As Long
Length = LOF(File)
For Pos = Start To Length - 3
Get #1, Pos, Buffer
If Buffer = Data Then
FindDataLong = Pos
Exit For
End If
Next
End Function


در مثال زیر ما ابتدا در فایل VB.EEC موقعیت دو داده H5DC3B8DF& و HA7F9067F& را پیدا می کنیم که اولی
Start است و دومی Finish و اگر پیدا نشدند با نمایش پیغام روال متوقف می شود.
اگر هر دو پیدا شدند، طول داده میان آنها (شامل خود دو داده شروع و پایان هم می شود) برابر است
با Finish - Start + 4 که Length خواهد بود.
سپس از داخل فایل file.ext داده ای به همین طول از ابتدای فایل خوانده شده و در همان موقعیت Start در فایل
VB.EEC نوشته می شود :


Dim Start As Long, Finish As Long, Length As Long
Dim Data() As Byte
Open App.Path & "\Vb.EEC" For Binary As #1
Start = FindDataLong(1, 1, &H5DC3B8DF)
If Start = 0 Then
MsgBox "Start position not found!"
Else
Finish = FindDataLong(1, Start, &HA7F9067F)
If Finish = 0 Then
MsgBox "Finish position not found!"
Else
Length = Finish - Start + 4
Open App.Path & "\file.ext" For Binary As #2
Data = ReadData(2, 1, Length)
Close #2
WriteData 1, Start, Data
End If
End If
Close #1

Mostafa Khalili
دوشنبه 29 فروردین 1390, 19:32
عالی بود تشکر میکنم.
حالا میخوام ببینم که اگر بخواییم کل محتوای فایل دومی رو در اون محدوده فایل اولی بریزیم باید چه کرد؟چون شما توی اون سورس اشاره کردید که به اندازه طول همون فایل اولی از فایل دوممون رو میگیره.
درضمن یه مسئله دیگه ای هم توی این کدی که گذاشتید هستش که میخواستم ببینم چرا وقتی ما برای جستجوی عبارتون یه مقدار 00 یا 0000 وارد میکنیم همه صفر ها رو حذف میکنه و یک صفر رو باقی میگذاره؟
دلیلش چیه و چطوری باید درستش کرد؟
ضمن اینکه اگر بخواییم به صورت چهار بایت چهار بایت جستجو کنیم چیکار باید کرد چون من هر کار میکنم فقط همون 00 و ff جواب میده بیشتر از این مقدار نمیشه.


[/code]مثلا برنامه زیر فایل file.ext رو باز می کنه، دنبال بایت های 00 می گرده و همه شون رو به ff تغییر می ده :


dim data() as byte, pos as long, length as long
open "file.ext" for binary as #1
length = lof(1)
if length > 0 then
redim data(0 to length - 1)
get #1, 1, data
for pos = 0 to length - 1
if data(pos) = &h0 then data(pos) = &hff
next
put #1, 1, data
end if
close #1

the_king
سه شنبه 30 فروردین 1390, 06:06
عالی بود تشکر میکنم.
حالا میخوام ببینم که اگر بخواییم کل محتوای فایل دومی رو در اون محدوده فایل اولی بریزیم باید چه کرد؟چون شما توی اون سورس اشاره کردید که به اندازه طول همون فایل اولی از فایل دوممون رو میگیره.

برای اینکه بتوانید داده هایی با هر طولی رو در فایل اول بنویسید باید ابتدا بقیه فایل اول را هم جداگانه بخوانید تا
بعد از نوشتن داده های فایل دوم آنها را دقیقا در موقعیتی که داده های فایل دوم تمام می شود بنویسید :


Dim Start As Long, Finish As Long, Length As Long
Dim Data1() As Byte, Data2() As Byte, Data3() As Byte
Open App.Path & "\Vb.EEC" For Binary As #1
Length = LOF(1)
Start = FindDataLong(1, 1, &H5DC3B8DF)
If Start = 0 Then
MsgBox "Start position not found!"
Else
Finish = FindDataLong(1, Start, &HA7F9067F)
If Finish = 0 Then
MsgBox "Finish position not found!"
Else
If Start > 1 Then
Data1 = ReadData(1, 1, Start - 1)
End If
If Finish < Length - 3 Then
Data3 = ReadData(1, Finish + 4, Length - Finish - 3)
End If
Open App.Path & "\file.ext" For Binary As #2
Data2 = ReadData(2, 1, LOF(2))
Close #2
Close #1
Kill App.Path & "\Vb.EEC"
Open App.Path & "\Vb.EEC" For Binary As #1
If Start > 1 Then
WriteData 1, 1, Data1
End If
WriteData 1, Start, Data2
If Finish < Length - 3 Then
WriteData 1, Start + UBound(Data2) + 1, Data3
End If
End If
End If
Close #1




درضمن یه مسئله دیگه ای هم توی این کدی که گذاشتید هستش که میخواستم ببینم چرا وقتی ما برای جستجوی عبارتون یه مقدار 00 یا 0000 وارد میکنیم همه صفر ها رو حذف میکنه و یک صفر رو باقی میگذاره؟
دلیلش چیه و چطوری باید درستش کرد؟

طول داده (بر حسب بیت یا بایت) توسط نوع داده مشخص میشه، نه مقداری که شما می نویسید، مثلا اگر متغیر Data
از نوع Long تعریف شده، 32 بیتی (چهار بایتی) است، اگر مقدار H12& را هم داخلش قرار دهید به شکل H00000012&
ذخیره و جستجو می شود. ویرایشگر ویژوال بیسیک 0 های اضافی را حذف می کند، اما اینکار تاثیری روی طول داده
ندارد، فرقی بین H0& و H00& و H0000& و H00000000& نیست، همه شان صفر هستند.



ضمن اینکه اگر بخواییم به صورت چهار بایت چهار بایت جستجو کنیم چیکار باید کرد چون من هر کار میکنم فقط همون 00 و ff جواب میده بیشتر از این مقدار نمیشه.

نوع داده متغیر Data را ببینید، Byte است، بنابر این فقط یک مقدار بین H00& و HFF& در آن قرار می گیرد :


Dim Data() As Byte


برای جستجو 32 بیتی بایستی از نوع داده Long استفاده کنید، به این نکته هم توجه کنید که اگر در جستجوی
32 بیتی دنبال H0& بگردید در حقیقت دارید دنبال H00000000& می گردید، یعنی به ترتیب بایت های 00 00 00 00
و اگر دنبال HFF& بگردید در حقیقت دارید دنبال H000000FF& می گردید، یعنی به ترتیب بایت های FF 00 00 00


Dim Data As Long, Pos As Long, Length As Long
Open "file.ext" For Binary As #1
Length = LOF(1)
Pos = 1
Do While Pos <= Length - 3
Get #1, Pos, Data
If Data = &H0 Then
Data = &HFF
Put #1, Pos, Data
Pos = Pos + 4
Else
Pos = Pos + 1
End If
Loop
Close #1

Mostafa Khalili
سه شنبه 30 فروردین 1390, 20:15
خب تمامی مشکلاتم برطرف شد و حالا سوال آخری از این مبحث رو دارم.
من میخوام بدونم چطوری میشه که محدوده دوم رو از فایل شماره یک حذف کرد و به برنامه بگیم که بجای محدوده شماره دومی که میخواد پیدا کنه به جاش تا آخر فایل رو سلکت کنه.

the_king
چهارشنبه 31 فروردین 1390, 05:37
خب تمامی مشکلاتم برطرف شد و حالا سوال آخری از این مبحث رو دارم.
من میخوام بدونم چطوری میشه که محدوده دوم رو از فایل شماره یک حذف کرد و به برنامه بگیم که بجای محدوده شماره دومی که میخواد پیدا کنه به جاش تا آخر فایل رو سلکت کنه.

خیلی ساده، بجای اینکه دنبال فلان مقدار برای Finish بگردید...


Finish = FindDataLong(1, Start, &HA7F9067F)


مستقیما Finish را روی انتهای فایل اول تنظیم کنید :


Finish = LOF(1)

Mostafa Khalili
شنبه 10 اردیبهشت 1390, 19:41
آقای سعید من با استفاده از این سورس ها برنامم رو نوشتم ولی یه مشکلی براش پیش اومده. من وقتی برنامم باز میشه ابتدا یه فایل از یه مسیر به داخل پوشه برنامم کپی میکنم با این دستور: FileCopy "address1", App.Path & "address2" و بعد از این کار وقتی میخوام با یه کلید دیگه یه فایل رو با دستور زیر باز کنم اصلا فایلم باز نمیشه انگار که دستور رو اصلا نادیده میگیره و برای اینکه بازش کنم باید یه بار برنامه رو ببندم و دوباره باز کنم و روی کلید دومی که برای باز کردن فایل هست بزنم تا اون فایلی که میخوام رو باز کنه: Shell App.Path & "\File.exe" ممنون میشم یه راهنمایی کنید و بگید واسه چیه.

the_king
شنبه 10 اردیبهشت 1390, 21:27
آقای سعید من با استفاده از این سورس ها برنامم رو نوشتم ولی یه مشکلی براش پیش اومده. من وقتی برنامم باز میشه ابتدا یه فایل از یه مسیر به داخل پوشه برنامم کپی میکنم با این دستور: FileCopy "address1", App.Path & "address2" و بعد از این کار وقتی میخوام با یه کلید دیگه یه فایل رو با دستور زیر باز کنم اصلا فایلم باز نمیشه انگار که دستور رو اصلا نادیده میگیره و برای اینکه بازش کنم باید یه بار برنامه رو ببندم و دوباره باز کنم و روی کلید دومی که برای باز کردن فایل هست بزنم تا اون فایلی که میخوام رو باز کنه: Shell App.Path & "\File.exe" ممنون میشم یه راهنمایی کنید و بگید واسه چیه.

تا دقیقا مشخص نکنید که از چه کدی برای دکمه اول و دوم استفاده کرده اید معلوم نمیشه که مشکل از چیه.
FileCopy اگه موفق به پیدا کردن فایل نشه پیغام خطا نشان خواهد داد و تا زمانی هم که کپی فایل تموم نشه
روال برنامه را منتظر نگه می دارد، یعنی تا زمانی که عملیات کپی به اتمام نرسیده است، دکمه های روی فرم
عمل نخواهند کرد. اگر فایل تان حجیم و زمان کپی کردنش طولانی نباشد به همین دلیل احتمالا یا مشکل از
مسیر فایل مقصد در FileCopy است یا مسیر فایل در Shell

Mostafa Khalili
شنبه 10 اردیبهشت 1390, 21:44
واسه کلید اول که عملیات کپی رو انجام بده از این کد استفاده کردم که حجم فایلم هم 180 کیلو بایته و ضمن اینکه عملیات کپی کردن با موفقیت انجام میشه:
FileCopy Text1.Text, App.Path & "\File.exe"
درضمن برای آدرس فایل مبدا نوشتم text1.text چون فایلم رو با کامند دیالوگ سلکت کردم و مسیرش رو ریختم توی تکست باکس.
بعدش برای باز کردن اون فایلم که پسوند bat داره از این سورس استفاده کردم:
Shell App.Path & "\file.bat"

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

the_king
شنبه 10 اردیبهشت 1390, 22:58
واسه کلید اول که عملیات کپی رو انجام بده از این کد استفاده کردم که حجم فایلم هم 180 کیلو بایته و ضمن اینکه عملیات کپی کردن با موفقیت انجام میشه:
FileCopy Text1.Text, App.Path & "\File.exe"
درضمن برای آدرس فایل مبدا نوشتم text1.text چون فایلم رو با کامند دیالوگ سلکت کردم و مسیرش رو ریختم توی تکست باکس.
بعدش برای باز کردن اون فایلم که پسوند bat داره از این سورس استفاده کردم:
Shell App.Path & "\file.bat"

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

اینطور که به نظر می رسه فایل file.bat از قبل در پوشه برنامه تون وجود داره (قراره باشه) و مستقیما ربطی به کپی کردن
یا نکردن فایل File.exe نداره. طبیعتا هم فایل file.bat همیشه بدون مشکل اجرا میشه، چون در غیر اینصورت Shell
پیغام خطا نشون می داد. فرمان های داخل فایل file.bat رو بررسی کنید. برای اطمینان بیشتر یک فرمان pause
را در سطر اول و سطر آخر فایل file.bat اضافه کنید تا قبل از اجرا کردن فرمان ها و بعد از اجرا کردن آنها منتظر
فشار دادن کلیدی شود.

Mostafa Khalili
یکشنبه 11 اردیبهشت 1390, 07:19
متاسفانه من به سورس فایل file.bat دسترسی ندارم چون خودم اونو ننوشتم.راه دیگه ای نیست تا از شر این مشکل رها بشم؟

the_king
یکشنبه 11 اردیبهشت 1390, 13:54
متاسفانه من به سورس فایل file.bat دسترسی ندارم چون خودم اونو ننوشتم.راه دیگه ای نیست تا از شر این مشکل رها بشم؟

مشکل اگه مربوط به برنامه ای باشه که دارید می نویسید که خوب حتما می توانید رفع اش کنید، اما گویا اصلا مشکل
مربوط به برنامه ای که می نویسید نیست. برنامه شما قراره یه فایل bat رو اجرا کنه، که لابد اجرا هم می کنه که
پیغام خطا نشون نمیده، اگه خودتون به فایل file.bat دسترسی ندارید شرایط اش مهیا نیست که بتوانید رفع اش کنید.

Mostafa Khalili
جمعه 06 خرداد 1390, 14:14
علی آقا اگر بخواییم دنبال یه مقدار بزرگتر بگردیم و جایگزین کنیم باید چیکار کنیم مثلا این مقدار
1122334462547418

the_king
شنبه 07 خرداد 1390, 03:28
علی آقا اگر بخواییم دنبال یه مقدار بزرگتر بگردیم و جایگزین کنیم باید چیکار کنیم مثلا این مقدار
1122334462547418

مقدار هر چی که هست بصورت بایت های متوالی جستجو اش کنید. به یک تابعی نیاز دارید که یک سری بایت
متوالی رو جستجو کنه :



Private Function FindDataBytes(ByVal File As Integer, ByVal Start As Long, ByRef Data() As Byte) As Long
Dim Buffer As Byte, Length As Long, Pos As Long
Dim Count As Long
Length = LOF(File)
Pos = Start
Do Until Pos > Length - UBound(Data)
Get #1, Pos, Buffer
If Buffer = Data(Count) Then
Count = Count + 1
If Count > UBound(Data) Then
FindDataBytes = Pos - Count + 1
Exit Do
End If
Pos = Pos + 1
Else
Pos = Pos - Count + 1
Count = 0
End If
Loop
End Function


اگه 1122334462547418 یک عدد صحیح 7 بایتی باشه در مبنای 16 میشه 03FCC1DAF595DA
پس دنبال بایت های DA و 95 و F5 و DA و C1 و FC و 03 بگردید :


Dim SearchData() As Byte, Pos As Long
ReDim SearchData(0 To 6)
SearchData(0) = &HDA
SearchData(1) = &H95
SearchData(2) = &HF5
SearchData(3) = &HDA
SearchData(4) = &HC1
SearchData(5) = &HFC
SearchData(6) = &H3
Pos = FindDataBytes(1, 1, SearchData)

Mostafa Khalili
پنجشنبه 12 خرداد 1390, 08:59
علی جان میخواستم بدونم چطوری میشه توی یه فایل تعداد دفعات تکرار یک کد باینری رو پیدا کرد؟؟؟مثلا ما توی یه فایل مقدار hd329845&
رو سه بار داریم حالا بخواییم توی یه لیبیل و یا تکست تعداد دفعات تکرار رو بنویسیم باید چیکار کنیم؟

the_king
پنجشنبه 12 خرداد 1390, 14:28
علی جان میخواستم بدونم چطوری میشه توی یه فایل تعداد دفعات تکرار یک کد باینری رو پیدا کرد؟؟؟مثلا ما توی یه فایل مقدار hd329845&
رو سه بار داریم حالا بخواییم توی یه لیبیل و یا تکست تعداد دفعات تکرار رو بنویسیم باید چیکار کنیم؟

با هر تابعی که آدرس شروع جستجو اش رو میشه تعیین کرد می توانید تعداد دفعات تکرار را بشمارید.

مثلا شمردن تعداد تکرار حرف a در رشته با تابع InStr بدین نحو انجام میشه :


Dim s As String, Count As Long, Pos As Long
s = "babbababaaabbbab"
Count = 0
Pos = 0
Do
Pos = InStr(Pos + 1, s, "a")
If Pos = 0 Then Exit Do
Count = Count + 1
Loop
MsgBox Count


مثلا شمردن تعداد تکرار مقدار H12345678& با تابع FindDataLong در فایل شماره 1 بدین نحو انجام میشه :


Dim Count As Long, Pos As Long
Count = 0
Pos = 0
Do
Pos = FindDataLong(1, Pos + 1, &H12345678)
If Pos = 0 Then Exit Do
Count = Count + 1
Loop
MsgBox Count


مثلا شمردن تعداد تکرار داده H12 &HB4 &HA5& با تابع FindDataBytes در فایل شماره 1 بدین نحو انجام میشه :


Dim Count As Long, Pos As Long
Dim SearchData(0 To 2) As Byte
SearchData(0) = &H12
SearchData(1) = &HB4
SearchData(2) = &HA5
Count = 0
Pos = 0
Do
Pos = FindDataBytes(1, Pos + 1, SearchData)
If Pos = 0 Then Exit Do
Count = Count + 1
Loop
MsgBox Count

reza0091
یکشنبه 15 مرداد 1391, 08:50
با سلام
اگر بخواهیم یک اسم را در یک فایل txt جایگزین اسمی دیگر کنیم از چه کدی باید استفاده کنیم؟
مثلا reza0091 را به جای reza ?!!
فایل تکستی که میخوام ویرایش کنم پر از کاراکتر و حروف و علائم هست و بسیار طولانی ! و با کدهایی که من آزمایش کردم برای جایگزینی کلمه مورد نظر،هیچ اتفاقی رخ نداد!
میشه منو راهنمایی کنید؟

the_king
یکشنبه 15 مرداد 1391, 20:44
با سلام
اگر بخواهیم یک اسم را در یک فایل txt جایگزین اسمی دیگر کنیم از چه کدی باید استفاده کنیم؟
مثلا reza0091 را به جای reza ?!!
فایل تکستی که میخوام ویرایش کنم پر از کاراکتر و حروف و علائم هست و بسیار طولانی ! و با کدهایی که من آزمایش کردم برای جایگزینی کلمه مورد نظر،هیچ اتفاقی رخ نداد!
میشه منو راهنمایی کنید؟
قبل از هر کاری از فایل متنی تان کپی بگیرید تا نگران خراب شدن اش نباشید.

Text باید از داخل فایل درست خوانده بشه، اسم مورد نظر به درستی جایگزین بشه و نتیجه به درستی در فایل ذخیره بشه.
برای خواندن و درست نوشتن در فایل (مخصوصا اگه فایل متنی بصورت Unicode ذخیره شده یا باید بشه) به این پست مراجعه کنید :
پنجره showopen و showsave (http://forum.majidonline.com/threads/38567-پنجره-showopen-و-showsave?p=620679&viewfull=1#post620679)
که دو روتین ReadFile و SaveFile کد اش هست.

مثال اش میشه این، به شرطی که بخواهید خروجی Unicode ذخیره بشه :


Dim s As String
s = ReadFile("C:\Your Folder\Your File.txt")
s = Replace(s, "alireza", "babak")
SaveFile "C:\Your Folder\Your File.txt", s, True


وگرنه پارامتر سوم SaveFile رو False کنید :


Dim s As String
s = ReadFile("C:\Your Folder\Your File.txt")
s = Replace(s, "alireza", "babak")
SaveFile "C:\Your Folder\Your File.txt", s, False

reza0091
دوشنبه 16 مرداد 1391, 01:06
ممنون
فقط یه سوال
از قسمت ریفرنسس باید چیزی اضافه کنیم؟ آخه هنگام اجرای دستور یه

ReadFile دیباگ میگیره!!!!

یا باید چه فانکشنی اضافه کنیم؟

مرسی

the_king
دوشنبه 16 مرداد 1391, 01:45
ممنون
فقط یه سوال
از قسمت ریفرنسس باید چیزی اضافه کنیم؟ آخه هنگام اجرای دستور یه

ReadFile دیباگ میگیره!!!!

یا باید چه فانکشنی اضافه کنیم؟

مرسی
چیزی نباید Reference بشه اما ReadFile که دستور ویژوال بیسیک نیست، باید کد اش رو بنویسید، لینک هم داده بودم که کدش کجا هست.

tebyandn
یکشنبه 14 آبان 1391, 14:55
سلام من یک کد میخوام که test.txt رو بخونه و جاهایی که نوشته farhad به amir تغییر بده بدون اینه پنجر ه باز شه تتغییرات در فایل سیو شه
منظورم اینه که تو یه تکس باکس هر چی بنویسم ورو یه دکمه کلیک کنیم به جای اfarhad متن تو تکس باکس قرار گیره خواهش میکنم جواب بدبن


test.txt
</Resolve>
<ProxificationPortableEngine subsystem="32">
<Location>Winsock</Location>
<Type hotpatch="true">Prologue</Type>
</ProxificationPortableEngine>:rose::rose:
<ProxificationPortableEngine subsystem="64">
<Location>farhad</Location>
<Type hotpatch="false">Prologue</Type>
</ProxificationPortableEngine>
<Encryption mode="basic" />
<HttpProxiesSupport enabled="false" />
<HandleDirectConnections enabled="false" />
<ConnectionLoopDetection enabled="true" />
<ProcessServices enabled="false" />
<ProcessOtherUsers enabled="false" />