[php4]file 'ontleden' werkt niet

Pagina: 1
Acties:

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-05 20:08
Ik heb een home made archief file gemaakt onder windows. Deze ziet er als volgt uit:

HEADER
Filename (12 chars groot, 8.3)
SIZE (4 byte)
filedata
filename
etc...

Nu heb ik tm de filesize ontcijfert en weet hoeveel data ik moet lezen. Deze data moet in een andere filehandle gezet worden.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$handle=fopen("archief.pak","rb");
$teststring=fread($handle,6);
if ($teststring=="HABPAK"){
    $filename1=fread($handle,12);
    $name=time()."-".substr(microtime(),2,4).".jpg"; // unieke naam aanmaken
    
    // grote bepalen:
    $int1=ord(fread($handle,1));
    $int2=ord(fread($handle,1));
    $int3=ord(fread($handle,1));
    $int4=ord(fread($handle,1));
    $grote=$int4*16777216+$int3*65536+$int2*256+$int1;
    
    $gelezen=fread($handle,$grote);
    $handle2=fopen($name, "w+b");
    fwrite($handle2,$gelezen,$grote);
    fclose($handle2);

De data die in handle2 staat is echter corrupt. (vergeleken met de data in het archief). Met C++ ben ik gewenst dit in een void buffer te drukken maar PHP kent zoiets niet; fread geeft namelijk een string terug. Ik heb overigens PHP 4.1.2-7

Hoe los ik dit op?

if broken it is, fix it you should


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Om te beginnen vind ik het nogal raar dat je voor $handle2 de file opent voor lezen en schrijven, terwijl je alleen maar wil schrijven. w ipv w+ is dus meer dan voldoende. Bovendien is de b overbodig tenzij je een Windows server gebruikt. Regel 15 vervangen door dit is dus beter:
PHP:
1
$handle2=fopen($name, "w");


Bovendien kun je de grootte veel korter bepalen:
PHP:
1
2
3
    for ($i = 0; $i < 4; $i++)
      int[] = ord(fread($handle,1));
    $grote = $int[3] * 16777216 + $int[2] * 65536 + $int[1] * 256 + $int[0];


Ik snap trouwens niet wat er fout moet zijn aan fread in combinatie met $handle2?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-05 20:08
NMe84 schreef op 30 augustus 2004 @ 00:48:
...
Ik snap trouwens niet wat er fout moet zijn aan fread in combinatie met $handle2?
Ik ook niet, dat was de vraag.

Edit: De code kan in principe nog veel korter en sneller; maar dat doe ik later altijd dis was een test scriptje en als het testscriptje al niet werk zal de zwaar geoptimaliseerde versie hiervan ook nog niet werken. Het lezen van de file heb ik later nog nodig daarom staat er w+, de b staat er omdat het script binnenkort op een windows bak moet komen.

[ Voor 45% gewijzigd door elgringo op 30-08-2004 08:30 ]

if broken it is, fix it you should


  • WormLord
  • Registratie: September 2003
  • Laatst online: 20-05 12:06

WormLord

Devver

Voor het bepalen van de grootte kun je ook unpack gebruiken.


En hoe is de uiteindelijke file corrupt? Is alle data corrupt, of alleen bepaalde tekens?

[ Voor 16% gewijzigd door WormLord op 30-08-2004 16:22 ]


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-05 20:08
WormLord schreef op 30 augustus 2004 @ 16:21:
Voor het bepalen van de grootte kun je ook unpack gebruiken.


En hoe is de uiteindelijke file corrupt? Is alle data corrupt, of alleen bepaalde tekens?
Unpack is niet nodig; ik wil alleen alles raw copieren. Zoals C/C++ met een void buffer.


De file begint het de juiste characters maar sommige zijn vervormd. Het jpg plaatje wat erin staat wordt nml wel als jpg herkend; alleen de data deugt dus niet. Mijn inziens komt dit omdat de gelzendata hexadecimaal is en geen string, maar het schijnt zo te moeten dacht ik.


vergelijking:
orgineel
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
00000000h: FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 60 ; ÿØÿà..JFIF.....`
00000010h: 00 60 00 00 FF DB 00 43 00 08 06 06 07 06 05 08 ; .`..ÿÛ.C........
00000020h: 07 07 07 09 09 08 0A 0C 14 0D 0C 0B 0B 0C 19 12 ; ................
00000030h: 13 0F 14 1D 1A 1F 1E 1D 1A 1C 1C 20 24 2E 27 20 ; ........... $.' 
00000040h: 22 2C 23 1C 1C 28 37 29 2C 30 31 34 34 34 1F 27 ; ",#..(7),01444.'
00000050h: 39 3D 38 32 3C 2E 33 34 32 FF DB 00 43 01 09 09 ; 9=82<.342ÿÛ.C...
00000060h: 09 0C 0B 0C 18 0D 0D 18 32 21 1C 21 32 32 32 32 ; ........2!.!2222
00000070h: 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 ; 2222222222222222
00000080h: 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 ; 2222222222222222
00000090h: 32 32 32 32 32 32 32 32 32 32 32 32 32 32 FF C0 ; 22222222222222ÿÀ
000000a0h: 00 11 08 01 20 01 60 03 01 22 00 02 11 01 03 11 ; .... .`.."......
000000b0h: 01 FF C4 00 1F 00 00 01 05 01 01 01 01 01 01 00 ; .ÿÄ.............
000000c0h: 00 00 00 00 00 00 00 01 02 03 04 05 06 07 08 09 ; ................
000000d0h: 0A 0B FF C4 00 B5 10 00 02 01 03 03 02 04 03 05 ; ..ÿÄ.µ..........
000000e0h: 05 04 04 00 00 01 7D 01 02 03 00 04 11 05 12 21 ; ......}........!



door php eruit gehaald:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
00000000h: FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 60 ; ÿØÿà..JFIF.....`
00000010h: 00 60 00 00 FF DB 00 43 00 08 06 06 07 06 05 08 ; .`..ÿÛ.C........
00000020h: 07 07 07 09 09 08 0D 0A 0C 14 0D 0C 0B 0B 0C 19 ; ................
00000030h: 12 13 0F 14 1D 1A 1F 1E 1D 1A 1C 1C 20 24 2E 27 ; ............ $.'
00000040h: 20 22 2C 23 1C 1C 28 37 29 2C 30 31 34 34 34 1F ;  ",#..(7),01444.
00000050h: 27 39 3D 38 32 3C 2E 33 34 32 FF DB 00 43 01 09 ; '9=82<.342ÿÛ.C..
00000060h: 09 09 0C 0B 0C 18 0D 0D 18 32 21 1C 21 32 32 32 ; .........2!.!222
00000070h: 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 ; 2222222222222222
00000080h: 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 ; 2222222222222222
00000090h: 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 FF ; 222222222222222ÿ
000000a0h: C0 00 11 08 01 20 01 60 03 01 22 00 02 11 01 03 ; À.... .`..".....
000000b0h: 11 01 FF C4 00 1F 00 00 01 05 01 01 01 01 01 01 ; ..ÿÄ............
000000c0h: 00 00 00 00 00 00 00 00 01 02 03 04 05 06 07 08 ; ................
000000d0h: 09 0D 0A 0B FF C4 00 B5 10 00 02 01 03 03 02 04 ; ....ÿÄ.µ........
000000e0h: 03 05 05 04 04 00 00 01 7D 01 02 03 00 04 11 05 ; ........}.......



Dit is overigens niet de gehele file

[ Voor 10% gewijzigd door elgringo op 30-08-2004 16:48 ]

if broken it is, fix it you should


  • WormLord
  • Registratie: September 2003
  • Laatst online: 20-05 12:06

WormLord

Devver

Het lijkt erop dat 'regel eindes' worden omgezet van unix-standaard (0x0A) naar windows standaard (0x0D 0x0A). Dit zie je tenminste gebeuren in de derde regel (offset 0x26) en op offset 0xD0 gebeurd het nog een keer.


Ik heb nog geen idee waarom dat gebeurd.

[ Voor 15% gewijzigd door WormLord op 30-08-2004 21:09 ]


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-05 20:08
Ik denk dat het door de 'magic quotes' komt. Maar weet niet hoe je dat moet oplossen. Ik wil het gewoon raw lezen; unsigned char voor unsigned char (byte per byte dus).


Maar hoe je dat uitzet......

[ Voor 13% gewijzigd door elgringo op 30-08-2004 21:15 ]

if broken it is, fix it you should


  • WormLord
  • Registratie: September 2003
  • Laatst online: 20-05 12:06

WormLord

Devver

Daar lijkt het wel op. Het commentaar op php.net bij de fread functie zegt het ook.


Probeer deze functie eens: set-magic-quotes-runtime.

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-05 20:08
WormLord schreef op 30 augustus 2004 @ 21:25:
Daar lijkt het wel op. Het commentaar op php.net bij de fread functie zegt het ook.


Probeer deze functie eens: set-magic-quotes-runtime.
En als ik die uitzet doet ie hetzelfde. Ik moet zeggen dat het met c makkelijker is.


Edit: ze stonden al uit. Dus dit was het niet

[ Voor 7% gewijzigd door elgringo op 30-08-2004 21:35 ]

if broken it is, fix it you should


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-05 20:08
Na wat reasearch kom ik erachter dat ie hem fout leest. Er wordt tijdens het lezen al een 0x0a als 0x0d 0xoa gelzen. Later deze terug vervanderen heeft tot gevolgt dat de file kleiner wordt, maar wel aardig correcte data bevat.


Als ik dus het aantal keer 0x0A wat in een file staat meer lees, en vervolgens alle 0x0D 0x0A naar 0x0A verander is het goed; althans dan krijg ik een correcte file die indentiek is aan het orgineel. Maar zo werkt het toch niet?????


Is de file dan toch verkeerd geopend? Of gaat het lezen verkeerd?


Edit: van de PHP site:
Als je niet de 'b' mode opgeeft als je werkt met binaire bestanden, dan kan je raar gedrag verwachten met je data, waaronder niet werkende afbeeldingsbestanden en rare problemen met \r\n tekens.


Deze heb ik; terwijl ik met linux werk die in mode rb geopend is.
Edit2: (engelse php site):
As of PHP 4.3.2, the default mode is set to binary for all platforms that distinguish between binary and text mode. If you are having problems with your scripts after upgrading, try using the 't' flag as a workaround until you have made your script more portable as mentioned above.


Ik vraag me af waarom hij als tekst geopened wordt en of PHP 4.3.2 dit kan verhelpen.... Ik heb namelijk weinig zin om 4.3.8 te gaan installeren. 4.1.2 moet ook binair kunnen openen.


Edit3:
Kan het in instelling in PHP.ini zijn? Ik heb er wel wat naar gezocht, maar kon weinig vinden wat er iets mee te maken had.

[ Voor 61% gewijzigd door elgringo op 30-08-2004 22:24 ]

if broken it is, fix it you should


  • WormLord
  • Registratie: September 2003
  • Laatst online: 20-05 12:06

WormLord

Devver

Het is inderdaad een raar probleem. Ik ben zelf ook bezig met het verwerken van binaire files en heb geen last van dit probleem. Maar ik gebruik wel nieuwere php versies (4.3.5 en 5.0.0).

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-05 20:08
WormLord schreef op 31 augustus 2004 @ 16:18:
Het is inderdaad een raar probleem. Ik ben zelf ook bezig met het verwerken van binaire files en heb geen last van dit probleem. Maar ik gebruik wel nieuwere php versies (4.3.5 en 5.0.0).
Het is iig niet goed. Ik weet niet of mensen hier ervaring mee hebben en een oplossing voor hebben. Ik denk zelf dat het een softwarebug is of een instellingsfout.

if broken it is, fix it you should


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-05 20:08
Schop; iemand moet toch een oplossing hebben

if broken it is, fix it you should


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-05 20:08
Schop

if broken it is, fix it you should


  • xander88
  • Registratie: September 2003
  • Laatst online: 05-10-2025
Misschien heb je hier iets aan?

http://www.0x2a.org/rw_binary.phps

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-05 20:08
Is dit een work around of waar lijkt dit op?

if broken it is, fix it you should


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-05 20:08
schop; ik zoek nog steeds een oplossing voor dit vage probleem

if broken it is, fix it you should


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-05 20:08
Ik heb nu php 4.3.8 erop gezet; maar nog steeds geen resultaat. Ik kwam deze ook tegen in php.ini:

; If your scripts have to deal with files from Macintosh systems,
; or you are running on a Mac and need to deal with files from
; unix or win32 systems, setting this flag will cause PHP to
; automatically detect the EOL character in those files so that
; fgets() and file() will work regardless of the source of the file.
; auto_detect_line_endings = Off

Is deze van toepassing op mij of niet? Ik denk van niet omdat ik fread gebruik en niet fgets. Tevens gebruik ik geen mac....

[ Voor 3% gewijzigd door elgringo op 07-09-2004 19:24 ]

if broken it is, fix it you should


  • WormLord
  • Registratie: September 2003
  • Laatst online: 20-05 12:06

WormLord

Devver

Volgens mij heeft dat er niets mee te maken. Bij mij staat dat ook uit-gecommentarieerd in zowel versie 4.3.5 als 5.0.0.
Heb net even een test gedaan op mijn systeem. Het copieren van een file via php op de manier die jij gebruikt gaat hier zoals het hoort. Met beide versies.
Voor de 4.3.5 versie is hier de gestripte php.ini (zonder comments dus):
[code]
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
engine = On
short_open_tag = On
asp_tags = Off
precision    =  14
y2k_compliance = Off
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func=
serialize_precision = 100
allow_call_time_pass_reference = Off
safe_mode = Off
safe_mode_gid = Off
safe_mode_include_dir = 
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
disable_functions =
disable_classes =
expose_php = On
max_execution_time = 30
max_input_time = 60
memory_limit = 8M
error_reporting  =  E_ALL
display_errors = On
display_startup_errors = Off
log_errors = Off
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
variables_order = "GPCS"
register_globals = Off
register_argc_argv = Off
post_max_size = 8M
gpc_order = "GPC"
magic_quotes_gpc = On
magic_quotes_runtime = Off    
magic_quotes_sybase = Off
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
include_path = ".;f:\website beheer\phpincludes"
doc_root =
user_dir =
extension_dir = "./"
enable_dl = On
file_uploads = On
upload_max_filesize = 2M
allow_url_fopen = On
default_socket_timeout = 60
extension=php_gd2.dll

[Syslog]
define_syslog_variables  = Off

[mail function]
SMTP = localhost
sendmail_from = me@example.com

[Java]

[SQL]
sql.safe_mode = Off

[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1  
odbc.defaultlrl = 4096  
odbc.defaultbinmode = 1  

[MySQL]
mysql.allow_persistent = On
mysql.max_persistent = -1
mysql.max_links = -1
mysql.default_port =
mysql.default_socket =
mysql.default_host =
mysql.default_user =
mysql.default_password =
mysql.connect_timeout = 60
mysql.trace_mode = Off

[mSQL]
msql.allow_persistent = On
msql.max_persistent = -1
msql.max_links = -1

[PostgresSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0

[Sybase]
sybase.allow_persistent = On
sybase.max_persistent = -1
sybase.max_links = -1
sybase.min_error_severity = 10
sybase.min_message_severity = 10
sybase.compatability_mode = Off

[Sybase-CT]
sybct.allow_persistent = On
sybct.max_persistent = -1
sybct.max_links = -1
sybct.min_server_severity = 10
sybct.min_client_severity = 10

[dbx]
dbx.colnames_case = "lowercase"

[bcmath]
bcmath.scale = 0

[browscap]

[Informix]
ifx.default_host =
ifx.default_user =
ifx.default_password =
ifx.allow_persistent = On
ifx.max_persistent = -1
ifx.max_links = -1
ifx.textasvarchar = 0
ifx.byteasvarchar = 0
ifx.charasvarchar = 0
ifx.blobinfile = 0
ifx.nullformat = 0

[Session]
session.save_handler = files
session.save_path = F:\temp\phpsessies
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor     = 1000
session.gc_maxlifetime = 1440
session.bug_compat_42 = 0
session.bug_compat_warn = 1
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"

[MSSQL]
mssql.allow_persistent = On
mssql.max_persistent = -1
mssql.max_links = -1
mssql.min_error_severity = 10
mssql.min_message_severity = 10
mssql.compatability_mode = Off
mssql.secure_connection = Off

[Assertion]

[Ingres II]
ingres.allow_persistent = On
ingres.max_persistent = -1
ingres.max_links = -1
ingres.default_database =
ingres.default_user =
ingres.default_password =

[Verisign Payflow Pro]
pfpro.defaulthost = "test-payflow.verisign.com"
pfpro.defaultport = 443
pfpro.defaulttimeout = 30

[Sockets]
sockets.use_system_read = On

[com]

[Printer]

[mbstring]

[FrontBase]

[Crack]

[exif]

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-05 20:08
WormLord schreef op 08 september 2004 @ 10:57:
Volgens mij heeft dat er niets mee te maken. Bij mij staat dat ook uit-gecommentarieerd in zowel versie 4.3.5 als 5.0.0.
Heb net even een test gedaan op mijn systeem. Het copieren van een file via php op de manier die jij gebruikt gaat hier zoals het hoort. Met beide versies.
Voor de 4.3.5 versie is hier de gestripte php.ini (zonder comments dus):
Ook met jouw php.ini werkt ie niet, ik vraag me nog steeds af waar die fout zit

edit:
Is er een soort van windows fread mode? Ik begin nu echt te denken dat dat er 2 lees modi zijn.

[ Voor 10% gewijzigd door elgringo op 19-09-2004 16:55 ]

if broken it is, fix it you should

Pagina: 1