Binärdatei schreiben

  • Hallo,

    Dieses Script-Schnipsel schreibt die Datei so wie sie soll und ist als solches dann ok:

    Spoiler anzeigen
    [autoit]


    Local $sfileex = "0x504B03041400000008002751922CD5BE762838F000008DE30200070000006F69642E6461748C5B5B73DB38967EDFAAF90F7CEAA9DA6D29ADD8F1E5611F40129210F11682B2ADDEDAAAA525C6E65822359494C4F3EBF79C03092420CA3DD59DEA340092C0F9BE73C5D1FF7879B30AF3B7A2F9DFBFFDC71F7F0CE85FE7BF9D279EC64F8E5737DBA11E1F5D18FF7C61FCEAC2F8F585F12F17C66F2E8CDF5E18BFBB307E7F619CC1781CA671E4642CE3420A8707DCCB604078D2F1E276A50B2B4396A5C27E8507139E905EECC885CC78287F7744E4B5F33ECC8F857B7C65B05F0DDB398E73F3AF2293739AD113639888F85366BE6B84F0C845C667E630A213C569C8531E1C77C1A59E458C4434867996093C29F7A6511CC4938513885064DCD74B11368F85FC498F5CD3464820ED20A2E5B38C25B18832531C2344CC9F3B490C338978D21B6AF783D825A9780081EB31C4ED91BBB03005A987C99CFE62BC182164491208EE3BFE2262218A13BECFD388CEC502BD145165FE038B3C580BEBD2D8F1F983F03A427149640F3C084C51229A2E8E6A2989CE533EC9C70D4820FD788F10D38C0752C80C26FCB904CEB00EAD985E892067C57A593BF27DB72F363B7853B5D46FFAFCC751CCA7B780487CC15C87B97A09222FE7290F5944721B3ABFE17FC3793484FFA649FB3264C1839073167409D0DDF967449FB96EBB6B8D5DF793C8082F8E22388FC3B4683E2327521622370DDC3E2321E4940D661CB738FCDD5481CFC886AF2C81FDA7CC17319D82450B3D7F476C897D01BB3DEDC6FC001243841ED2F4314E67D23A3892214B1F9D8123B9EF7F1251A2A790045E2A64E2B079162BF52034F50AA403CEC13FDCD696CFC486694A0F1217DBE7900432F60487C78079A906FD33812E429E04FCC910FF15C2FD307102E6C629CBE2B43D6FD7345C21E4DF12F974C4190885DB964E922DCC8588789837CBBA2A9DED7AA9C711663E018187CC9B8A88C3872CA15F1DB51EC5E9A45CC6F31474C714FB15022E1364359BA42C9992C1345620F240DF5458E30879FC04060994133489CCA229DA2B44DD931285A12976854067B19C0A97596F6484C40295D29C40844B18ABF64DBDB6F4EB4A810B6778D2923600417C41C030A787085701C2F2323D8688CA4594A5FCC93405D78828992CEFC8AB760A510483646EF79A20E3196A3A68349B801D0733DAA541BB166154B6ADD5673D494ACAE0B120B0BF81B891EC19F8430927E1479B61598C6B842F0EC403CF3281EE259B3AE01AD28E05BB46248181311844381ED88C396ED8D2C06B045372318B1D9E481BA26B65D7E1B571A64DBFFCDDA0F2B532E81ECCFB1C4E6A9830F35B2EC93520BBE9C4AD403C62B4677D1B11F63D8B9FD708320B9116E638028D0EC14BD9D8F2CC5F106A34608095F9D417447A1ABB1D0FE04C42774A421F3AB3895E487E1A887AD89575355CD61B93AE5FC839A380F0C47A14910EC13C9E51ECCB17B53E1452820E32B0D64EF07F1CF41D5C1AE8651CB64BC969A743C71D3A08A237D33388B0F440378FC23049F8E58E8E0D1BE2ADDB466B3DF7325399BE20CC53A0A398703ABF9E406CC1FFCDEAAA2A967B67B2796EE7104D1E00D828BD19496FE6B05664882A709C6B0BDC8906CCCF93AD96B41836AA8711EAB9F48CF8088ECB23B477C868BD92B47C0E562A0EE32396029FF36D8F7683549841F883D6A8B3EDEEA16F90141308801ED9C2B2E37A09D2C19D03D7A791B93D339CBAB952D8896832947C3EE669667E0A09B28867F1843D32881F262203D9B43156874B375F9CD6EC3389FE0BB668C53737C8157805504AF6474037C499789C39FFE9A4C01C6B9628134B1EC6730C1E4950417B9C7B626DE4A185B23C5CC7C1DEB09332A84344126C90C9B81B248F14647C1DEDA170C5A75024ED07914356387A436C49CFB0B19126439166020F6B9D12E912321FC8AEC312E3D95B64C9140C95E5F96E9119CC4F59AF4BBA25072122F1C840E3CEEDFEED159D19286E45CFB7C802B4B1D393AFB7B643D0D7CDBE583B51B1FF59376F3B3D477EDCE533262182F4F929D1D1F38837A95E3265D27237B7083778F18C856747BDD77403D72210F204239FCE0A44D90747D8426D48031186F084B3D49B9EA2190DEC2DB97730E320A9DE97FBA4D19172A2BD4CBE4580BD808261CB19DC923310519C2D123E40C3D6B14B777FF4F3C7619FF4F6EE106817969CF8A1271063B22F270E00B1A5F6B97757A47F7E0284EFBAC124D0CA71774D278393C3BBF520B90316C59171C43B04378470700A86E34FF38C7708EC14EC0508D6A2FEDD5D57FF4E3603B763451177A4CF6C81094A1FA3EF14C4199BC673C93F327477E4DA611EEDA91E249083205E9CFB1F13CB3B84FB81A7BE8DE49D8AD50317A2DCA87563D6D30837009A4D791CD9E1F2FD1FCE3114EBB8967B52E428A5DCDEF8E0FD6792DD04433B0A53FA52CD7B84194E92710BB07B04974906FAD6FF20C5E531287876743D4F2622F78438A80C4C19D50E03E07BC49E2731289685C33D410F1A2391DCD6D110ED30B3E2E07BC438F55A843A6A707F42F584BAE1C38D64EC1EB1065F1182AC8301A61E6DBCA8D720CA41ECCDE5710EDCA2B545AE8E1F08470E593B8C0053782B216331246B9C8521D6593C5B8015040A7442018CE60C11B291FAD2B73944D0DC58A8979093EF31020CE1D7AE985208BB78A397122100E2A815876D6AD931164CE0252ED80D9D487789C16E3ADF9C60A08881425776ECB6B3A295EFB1B662CA89827EB0619986C2B2DEECBEF3B2FE0D216F7AAA76CC758E8138"
    $sfileex &= "12372DFB866C09BF4AE85C55A5EB2BAB7582D78AB14FBB0CFD3943C8F8754D837B471225C7E19F8D386E7364267E495ABFFB72898B4652ACE012091122448810214284081122448810214284209665F52487816834AA94C3C6D2FBEF33999C74459CCB293FEE377F97E723A51C961D76D62C47EC7A9DEC6EAD929DF515B25BDFA0E7CD1D96DABB5B2CADAF915ADFF923C7CF7DA4D50EFD0272DE5AADD1E3FAD205F0ED1992BF7082CC65D234ADE533D416CD6DD9061EFEA7B864A4E31A3F47D902C973B1411E7271C0B9DFB5C99BA45D5476E8970D7656D23445EEABD619D280F3C6729A34D72E90C6B6451A1B73E47DB0C5F6C632B1310E682CF4DBFF8F3A7257DBA17FFC379626C9CE32E3BEBB0CFC41D6AD349D03F5DA1947300E1ADBEB6AFF4BD8DBDBA3D2D2C7C686329FE111B90BDC83F0776DD0BF18C0D8B7C1CF823FC6BFBDB5CC78B6489D348037A6767D9DAE8141F83F7CF8D0C9F3E3FFE62397A36D33519D1F460C501BD4336477E514E5AF92E5B90B6C3D6C6C53FECBF97C20FE32F7A0FC65CE5E5BC831D00FFE18FF08B441731D627DE91469ACBD436567294DD7037B2D43D61EBEC3F9EF00FF0DB23237D795BFD7F7BDF057C5C161F047C836A0F300E63EF6BBF1F014E58EEBC3DAD21CE3DEDC0DCCBFD3712B5CFEF21AF05DF91FB1BE9C27F5953C69C23C6FACA5C9D6D2192A381F1AAB67A8EFE9389A0D26C07FB5C3FD9FE0297CEFCD6F07F2FFBC85BFDFFC3F0CFE088C0114BBB1041C2DBA1E3437D2D42ED8375E079B0DF0BDDDA4FCD76A0F7DF9775A07D450C7402741FE87711FB8BDB644F9A21D444A6D02FCD11618F34290BF0A9DE67A77FE2C06840DFCECD06FDF0B207F116BE8EBC6F616CD43C16BFF7ACDA2BEDF5DB9D051C7FEF823980D9CB5B0831D0ECBF70899BF4A903FC6C5E181DDD7083BC822781FE63E50F8BA9320FFEF06EAFD5F881F3B60D398AE83AC30E915A21DEA005D386B84FC305023F93A8C366D1F80BFCD7420FF7CBAC506CFBF1D14FCB7B65A2593E9DC5CC55F08E1FCD39D9B7F1FC8001F212AFE99D5D556817D17AD7FEA54BB320F7F84E0EFFCFD45880FFCAE812841B1B8B8D8B5FE16FA54FCAD48E57F2CCB9F725371AC0A03157F54837CF1EF3C2BE940FC71DC285EF4C25FE8E8D646F0A7291CACD8EDFCA9CFC1DF991A8F13FE77B58C772E70FE5407C63FE79EAEA7DBF907B08117BDFA5E20087FE17F2FFFDA2A705FCD50918FB17E2DEF21E1E55F677CEB76DDB5410FFCBD1C7AF5BD805F5BCA3F9F61295CB7EA368F5F7A0D23CC36C23E2879661335FF3A6D5BB7597BE42F624069832E08EA432F7A891DC15FF0CBE7D9B51BA5B6B54A054F5761EDABD56A8CF716AE839976FEBC1DEA40DE82BFBC06B6D8A00B841F0FE27B814E3AE4F99FE17C56788A7EA6BEE6E56803997FA68DBFDB1641F92B6C1084BB80E01F14827F27F162797999A6B896E1F14A3AEDECB12877C0E4E42470CE3B7341C4BF2893816D5107EA12EB231EB7DC0B80241209F23C200F63B5EDBA738E315EAFAFB058E7E758077D2F8BF03D96C975E5B608D44DFB90B8BBA5DF3F04FF3CF7BBDDA83B1CD6D7D79DB26EEDB1AEE04F75802E59B7CCFF79C28A34E7659E386EE4E1C75D80F283BA721C619EACFB79E42E207317E3161214721BAA0BD678C7062BCF27EF1F2B701EE2F5AA9B78D16DDFA1DA8374BBD6F4722DEA1790FFEEEE6E9BC808CA9F2C76C8E7401E9B9B9B6D22F3F72BF74346ECB965F1DB7F03BCD755718E7CEBF5BC2341F823F76EFC11DD7CEB572EEFBFBD52F3EEBD15FB6F7035F049735E69E9B8F51C2173EEC65F7097C58F3FFA14736D7E1EB45CDE7FE13D25DE1B8A54DC7BFAEDBF913F0E07AFBB426CB8E1B429FF15CA1D8FB19E1C03FBF17FCBB1847EF017F7DFC8D9B9CFE6FCFDF6DFCCFF79C6998B3817FC452C20B6B7B7DD7E3D50C6F96270FE9DE6B65F79CBFE9BEF2F9D7D26EEBF02ECBF450CD07B107A1FC2ECD0ACAFBAF6F0C4801F7F6FAC77E38F404EB2042D97F7DF9DFCEFB58F77FFCD6220CD78CB36E029DA41C40202AF0541F977B4459FE0DD7FB7F93FE0FE9BC5409E349B4DD7065C903B8D0529067AE1AFB2412778FDEC1713886EF33FE8FE9BC500CEFB7ACB754E088B81BCF25A20E08D75AF04E5DFCBF55EF85F8E75714CF9E3BE1B43A0C3FE5B06DA002138CAC03810361031D056A7C39CEFC5FF88A0BE4778F7D54145F5B71711035ED0BD9C580FA475A0BD5E6F6B5E278818C02654850FFF7E036D20EF436560BE1C03EDE5EDFCBD3E0F6287EF9B3FF2C3BF4788755E4E311F8FF7CB3F08BC6BC077C91F81DCBAC96123E8FCCF4CFC8A1F61DAFAD6008D154414CD48B0483C6C3C218BDAD393843C86E3C771B6586E0E10FABE83458DF158D4DADB2DF2F4124FFFE4C9DF24ACDD638DA7034C2FF6416584F50B36B0FF633FBE88E9637B7384A6F1CD384F073025DAA6F634BEF711A65FEF7E7B11B53F6B3CFB14D36FBFF8FA8F98EE7DF9CD97C862EFE4575F10F24FCDBEF8648468298DB5274CCF4542F55EFF68E9F7987E626F42BFDF82D6C545DB7E4A36619C7BF1A73F6529CC00EDE38FA1ED304FD93921519662F9679FB1F4E9088E61537BE2A6DABF31FF24D1761731B5EDAF1E6F0E60FA44DB8C63FA74607304B9A811CBE29B2FCA8395F9CBE64C621CDF63762F578C4CC76F1AB4203E444BE8317BDBC57DE79D1847B253B97BFAE542AE68CE0C4F177233787AB550D463F0038A62BFB8969DB89EC29CD46B675F9FADCC17CF7CC8D20F478B455A6061C959CC3E3B982D54A0ED71D422BF6D8CBF38"
    $sfileex &= "4753BC8A83BDD8885578CBF3168ED36FB0B770444992047F0BC73922BD85E39CC260214284081122448810214284081122448810214284081122448810214284081122448810214284782EB19FA7887E6838E853448709FC5FFB768FFF57D1EEF17FA21EF429A2C342EB93D0C16D20B7F3C28FFF7E9F223A2CEC973F4265834E3AFAF11451BFD1CBF855E899FF019F22EA370ECA1F11347EFAF51451BFD0EBFCED849EF8FBCCFF5EDFE27150E0B83BC97E62A05B9B7E3E45F443443F9F220A11E2FF0DEAA770D85303ECF115D5532C885E57B31F236C25F6E2AD29D1E0F8237CB6C5B69F7DDA6C60BB679FE27337B6FDCD9722C5E7726CBBD960E993117C6EC76DAF46A7711DCD4EDFCFE4CA13392337A3978FCA27E9E1ABA651797D6C3657B6F44A7C78F4C6D4F80763D74627A7AE648758915934CBF1E17CF1BD82316D2E64F5FB9523B4807F9FF6BF497A861F018FC5B2B959733EC71AD2EF6D1F2151E8CC3AA60D8D168BE6C258D1B4F4C44FE8F1AFAB85FCDC58D5AA98F385DF158C9984FBA5F2895CC1484DE846F5C5CB667E4E9FC65FA8C1BEE03D386DE187B45909FBF676929DD00FAA0F2B2A27AF16CD5C85D54DD0635AF5383D641F59675FDD252F48599C20191AB77040389E6472BCA2CF5F2F187340298AC7F1417CCE271DBF5DB00A778A7A9288EC6B7AB124659328B5904B2D71D3D06F1A93E64272007EA097772DFDE68281A64B38CD12EFCD9A451D2B11AD9BD5E259D32CDEC9957BB7D92BFE361BF887E6186DE07385D55E5158EDE5764BC5EE548CD1724932D550469F29186F97CD6A29C9EA24F2F3D3F4BBE5688EF265FD6EC1D08F0C57A76F81D92A7478E41896B8E7F163258B9BE0EDE283D26C9B27E25425B03FB846EEC42337F48514B7B6C78D9AECC661389ED4AD0AFDCA7BB2DDA909425E1CCB55F419131F04830953061F585A2C0EA3CC558B9558943E6E16C5508A0D62D0588E97C909A925F2B4B87A4B8B38202F49959CF224828C5C2DA2CB603E66AA958A692493D7CC0A7DF4CC8A4BDF808EB5671DBB6596AA251C0E732F199EAA1A73BA9131F173D4C9A3C07AEA810543422324D9E36B7FE08FAFD1E01C83FCB259649102E325F0EFCD88BB504D55EF20233EB3447C0F9EC6F30467F42032200C1A4F14EE8D1617720FACF6984BCE1BD5774BD3D0A62D2E86A0081FC6EB169271A877E57EA122850121C36CA4DC746E27CE649CD4EF96756BD61DAED63E5C66D371635ABF1F8924A666CD7265AC5A8954E2370D984BF9B9F83147313DF7742B1310FD1E731E2FCCE6EEC8D6EAD27DC2E973C4D5AAEAF425287E5BAF8C99F3A56A452FE37CB09CDE5F849294284AD1B2C0231870467042D1856A288E6344F7513CF3EDD0E96398B7E57A3D81C7D66E37F0F0BCC7C04B4007A377CCAA4FD8B8559C9EE8A9DB53C4DF644987CE51A14A69275877E947E1453789CB052B6FDED3CB6E4FD1E83558FE622951929AC8E56761A5B452A691AACCEAA91B7A65C12CCFF90F28E6DA97F7A91A8FB80E38C3C1E5148DD6369C9357E19E0387921A9D9E86E964A5EE3CA0C13DA9FFB60A0BABFF68E2CE688EB01E5583712E38EEDDC7E98EE6710C17D40C478576A55FF885C9E979E4349E3A3E7820F51FBF62E07C9E4EB0811C6BADE83F9C21D72BBC473E1A4404EEEB5F3B9EA2F7F9E73542EFF2BD7909278F38794945BD219E8739B85FC0BC238ABC88226F40911755E40D2AF2628ABC38617B96540AD304F94B02D3C5C879C8BF4DA6C807F07B854CC2D138B9496EC0F938FC5E8563C446B4B1C7DA47E8AF48C583E651C22C256387664C910A29930231C80C682B9022D141B341EE12134AFF4AEB9C236F815C00390F63384F7312A06F0CEACC9312C941FD07309A1C9CE954F765484BA02D4FAA04BFFD70968E46E8C7520BCAB0DF12F45F003D86332EA65BD4BD0D5286DA6E9D37C8EB24ED08213FA3BA71CC155AD78071145B4643C8695AE73A9CCFD0521C7909C68C239821B3D092E1ACA75E166AE4C8349CCF435A2673C4FD9205AB7B93EB28F07EC5B88D96FED9186F415D13B455817BC533428848CABBB58E973D723EE70821AF52BDCC0FF3B4D78A33C2CBF4F7361D77BB6709F9398D0AC6D080564548655F2413FF8A9210FBC2FF00504B010214001400000008002751922CD5BE762838F000008DE30200070000000000000001002000B681000000006F69642E646174504B010214001400000008002B9B922CD80EDD277F0C070000AA0E000D0000000000000000002000FF815DF000004172705669657765722E657865504B050600000000020002007000000007FD07000000"
    Local $hFile = FileOpen ( @scriptdir&"\"&"t.zip", 16+2 )
    FileWrite ( $hFile, $sfileex )
    FileClose ( $hFile )

    [/autoit]

    Das Problem ist folgendes:
    Ich lese aus einer MSSQL-DB den binär eingelesen Inhalt einer Datei ein und erhalte diesen im Prinzip genau wie z.B: oben der Inhalt von Sfileex (natürlich um einige grösser)

    [autoit]

    0x255044462D312E340A25E2E3CFD30A312030206F626A203C3C2F547970652F584F626A6563742F436F6C6F7253706163652F446576696365477261.........

    [/autoit]


    als String bzw. in nem Array. Aber halt nicht aufgeteilt nach z.B. 4000 Zeichen

    Allerdings schreibt Filewrite dieses als Textinhalt in die Datei. Es ist alles vorhanden was aus der SQL kommt jedoch nicht binär sondern textbasiert. Ich denke, das Problem liegt hier bei der Größe des String/Array, da wohl Filewrite nicht damit zurecht kommt??

    Hat wer ne Idee oder steh ich aufm Schlauch?

    Habe gestern nach Hilfe in der SB mit

    [autoit]

    StringRegExp($sfileex, '(.{1,4000})', 3)

    [/autoit]

    ein wenig herumprobiert, kam aber nicht auf einen grünen Zweig

    Einmal editiert, zuletzt von Torni (25. Juni 2013 um 09:44)

  • Liest du die Daten denn auch binär ein?
    Evtl mal rumprobieren mit

    [autoit]

    IsBinary()
    Binary()
    StringtoBinary()
    ; ...

    [/autoit]

    Evtl kannst du uns auch eine der MSSQL-DB Files zur Verfügung stellen, dann kann man selbst testen ;)

  • Hallo,

    warum geht das erste Beispiel oben im Schnipsel (1. Spoiler)? Da ist ja alles in Ordnung.

    Das ist doch auch nur ein String, so wie der den ich aus der MSSQL bekomme.. (2.Spoiler)
    An für sich beides gleich, nur schreibt Filewrite beim "größeren" String kein Binär sondern alles als Text in die Datei.

    Wie gesagt: aus der DB bekomme ich die Datei als String zurück, so wie im 2.Spoiler" . Deswegen müsste es egal sein, ob ich so eine Datei zur Verfügung stelle. Sind doch beides willkürliche String mit "0x" am Anfang oder?!?

  • Hallo BugFix,

    ja und auch mit den anderen schon rumprobiert.
    Allerdings zeigt er im 1.Beispiel - welches ja ordnungsgemäß funktioniert - bei IsBinary ne "0" an - klar, weil es ja ein String ist. Doch warum geht das dort?

    Beide Versionen sind ja Strings, nur der Unterschied dass der zweite um einiges grösser ist; der erste hat bei mir ca. 5500 Bytes und der zweite so um die 1MB.
    Das ist der einzige Unterschied.

    Hier der Code bei der der String aus der DB verabreitet wird:

    Spoiler anzeigen
    [autoit]


    $aQResult = StringSplit($resultstr, "|")
    Local $steststr = $aQResult[3] ;hier steht der komplette Strin drin 0x2550...
    Local $aRet = StringRegExp ( $steststr, '(.{1,4000})', 3 ); zum aufsplitten in Blöcke
    _arraydisplay($aRet) ; wird alles korrekt angezeigt
    ;ab hier zum Testen
    $steststr = ""
    For $i = 0 To UBound($aret) -1
    $steststr &= $aret[$i]
    Next
    Local $hExtrFile = FileOpen(@ScriptDir & "\" & $aQResult[2] & ".pdf", 16+2);Original-Dateinamen aus dem Array
    FileWrite($hExtrFile, $steststr); $aQResult[3]); beides das gleiche Ergebnis
    ClipPut($steststr); kompletter String ist ordnungsgemäß in der Clipboard
    FileClose($hExtrFile)

    [/autoit]

    Einmal editiert, zuletzt von Torni (21. Juni 2013 um 10:13)

  • Hast du dir das Beispiel in der Hilfe zu isbinary() angesehen?

    [autoit]


    Local $bBinary = Binary("0x00204060")
    Local $sString = "0x00204060"

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, "IsBinary $bBinary", IsBinary($bBinary))
    MsgBox(0, "IsBinary $sString", IsBinary($sString))

    [/autoit]

    Autoit interpretiert es demzufolge nur dann als Binärstring, wenn es zuvor mit binary() als solcher "gecastet" wurde, andernfalls könnte durch den Variant Datentyp den Autoit verwendet eben auch mal der falsche Typ String verwendet werden. Ob das für filewrite überhaupt einen Unterschied macht und ob dort nicht ohnehin eine binäre Interpretation stattfindet wenn zuvor der binäre Schreibmodus durch fileopen erzwungen wurde weiß ich nicht. Es sollte aber auf jedenfall nicht schaden zuerst binary() auf den Quellstring anzuwenden.

  • Schnitzel: hmm, da schreibt er auch den "Binär"-String als Text.

    misterspeed: auch das mit Binbary hatte ich schon versucht, gleiche Ergebnis:


    Seltsam: Test auf IsBinary aus dem 1. Beispiel ergibt 0, wenn der String mehrere Zeilen hat ?!?. Lasse ich den String einzeilig dann ergibt IsBinary "1"

    noch besser: schreibe ich es direkt aus dem Array, schreibt er den ersten Block binär, den rest als Text:

    Spoiler anzeigen


    For $i = 0 To UBound($aret) -1
    FileWrite($hExtrFile, $aret[$i])
    Next

    3 Mal editiert, zuletzt von Torni (21. Juni 2013 um 10:52)

  • Es werden definitiv IMMER die ersten 2000 Zeichen binär geschrieben, danach im Klartext als String.
    Hierbei verliert er aber die fehlenden 2000 Zeichen von ersten array ??

    Das u.a. Beispiel kann man schön ausprobieren und sich das Ergebnis anschauen.
    Auch ein Einfügen von "Binary(...) hilft nicht. Da wird doch der Wurm verrückt..

    Spoiler anzeigen
    [autoit]


    #include <array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $hFile = Fileopen(@ScriptDir & "\bc.zip", 16)
    Local $hread = FileRead($hFile)
    FileClose($hFile)

    [/autoit] [autoit][/autoit] [autoit]

    ;MsgBox(0,"", $hread)
    Local $aRet = StringRegExp ( $hread, '(.{1,4000})', 3 ); nach 4000 Zeichen "auftrennen"
    ;_arraydisplay($aRet)

    [/autoit] [autoit][/autoit] [autoit]

    Local $hExtrFile = FileOpen(@ScriptDir & "\76.zip", 16+2)
    For $i = 0 To UBound($aret) -1
    FileWrite($hExtrFile, $aret[$i]); im ersten Durchgang schreib er 2000 Zeichen binär, danach in Text
    Next
    FileClose($hExtrFile)
    Exit

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Und warum willst den Mist unbedingt in 4000 Zeichen Blöcke zerteilen?


    Geht 1A:

    [autoit]


    #include <array.au3>

    [/autoit][autoit][/autoit][autoit]

    Local $hFile = Fileopen(@ScriptDir & "\test.exe", 16)
    Local $hread = FileRead($hFile)
    FileClose($hFile)

    [/autoit][autoit][/autoit][autoit]

    ;MsgBox(0,"", $hread)
    ;Local $aRet = StringRegExp ( $hread, '(.{1,4000})', 3 ); nach 4000 Zeichen "auftrennen"
    ;_arraydisplay($aRet)

    [/autoit][autoit][/autoit][autoit]

    Local $hExtrFile = FileOpen(@ScriptDir & "\test2.exe", 16+2)
    ;For $i = 0 To UBound($aret) -1
    FileWrite($hExtrFile, $hread);$aret[$i]); im ersten Durchgang schreib er 2000 Zeichen binär, danach in Text
    ;Next
    FileClose($hExtrFile)
    Exit

    [/autoit]
  • das ist ja das Beispiel um das seltsame Verhalten zu dokumentieren.

    Den "richtigen" String bekomme ich als ganzes aus der Datenbank geliefert. das nimmt er nicht, weil zu gross.
    Da kommt dann die Fehlermeldung:

    F:\....au3 (1) : ==> Unterminated string.:

    Deshalb habe ich den String teilen wollen.
    Wenn man das Beispiel aus Post #1 also den String in eine Zeile schreibt, sieht man dies.

  • Ich versteh dein Problem noch immer nicht. Willst du nun Daten aus der DB lesen um diese als Stringverkettung in ein anderes Script einzufügen oder willst du Daten aus der DB lesen und diese direkt in eine Datei schreiben?
    Im letzteren Fall spielt es keine Rolle wie lange ein String ist, nur wenn das ganze in Stringform in ein Script soll muss der String in 4k Zeichenblöcke geteilt werden, weil dies eben die maximal erlaubte Zeilenlänge ist.

    Überschreitet man diese Zeilenlänge in einem Autoit Quellcode gibts besagte Fehlermeldung. Das passiert aber sicher nicht wenn du den langen String in einer Variable hast die du für irgendwas verwendest.

  • Ja ich will den übergebenen Binär-String aus der DB als Datei speichern.
    In der DB sind tausende PDF abgelegt (binär-Strings) und diese will ich gezielt wieder als PDF speichern.

    Allerdings wenn ich den zusammenhängenden "Binär"-String so direkt speichere, speichert Filewrite trotz Fileopen(...., 16+2) die Daten als Text.
    Dabei ist es unerheblich, ob ich StringtoBinary, Binary noch sonst was nutze.

    Wenn ich mir einen Teilstring von dem übergebenen (aus der DB) hernehme und NUR diesen einzeiligen (weniger als ~4000 Zeichen) genau auf die gleiche Art speichere, dann schreibt er dies Binär, sprich ich habe ein Teil der Originaldatei erstellt (siehe 2.ter Spoiler in Post #1) - nur den Gesamtstring schreibt er nicht so, wie er soll.

  • Hi,

    Zitat

    Allerdings wenn ich den zusammenhängenden "Binär"-String so direkt speichere, speichert Filewrite trotz Fileopen(...., 16+2) die Daten als Text.
    Dabei ist es unerheblich, ob ich StringtoBinary, Binary noch sonst was nutze.

    Script?
    Das von dir beschriebene Vorgehen wende ich in div. Scripten mehrmals täglich an, ohne Probleme...
    String lesen (was auch sonst...) und diese Bytes in eine Datei schreiben...ohne Parametergedöns als Einzeiler.

    [autoit]

    filewrite("demo.com",binarytostring("0xB81300CD106800A00711C8AAE2FB40EBF8"))

    [/autoit]

    Erstellt eine ausführbare Datei, und ob in binarytostring() die Rückgabe einer Datenbankabfrage steht ist egal, habe ich ausprobiert.

    Zitat

    Wenn ich mir einen Teilstring von dem übergebenen (aus der DB) hernehme und NUR diesen einzeiligen (weniger als ~4000 Zeichen) genau auf die gleiche Art speichere, dann schreibt er dies Binär, sprich ich habe ein Teil der Originaldatei erstellt (siehe 2.ter Spoiler in Post #1) - nur den Gesamtstring schreibt er nicht so, wie er soll.


    Lass dir mal die Stringlänge des "Orginals" ausgeben

    [autoit]

    stringlen(stringtobinary(fileread("test.pdf")))

    [/autoit]

    und vergleiche das mit der Stringlänge deines Rückgabestrings aus der Datenbank.

    Zitat

    Den "richtigen" String bekomme ich als ganzes aus der Datenbank geliefert. das nimmt er nicht, weil zu gross.
    Da kommt dann die Fehlermeldung:

    F:\....au3 (1) : ==> Unterminated string.:

    Da ist was faul...Wenn der String in eine Variable passt, wird auch in eine Datei geschrieben...wieviele Gigabyte hat die Datei?

  • Zitat von Andy
    [autoit]

    filewrite("demo.com",binarytostring("0xB81300CD106800A00711C8AAE2FB40EBF8"))

    [/autoit]

    Erstellt eine ausführbare Datei, und ob in binarytostring() die Rückgabe einer Datenbankabfrage steht ist egal, habe ich ausprobiert.


    Lol, also was immer das ist, es lässt meinen Grafikartentreiber abstürzen und danach den ganzen PC :D:D
    Totaler Crash, DEADBEEF :D

    Um Missverständnisse zu vermeiden, mein Name rührt vom Sternenbild und nicht vom Shop her :D


    Rainbow Dash :rock:

    "Das, wobei unsere Berechnungen versagen, nennen wir Zufall." (Albert Einstein)

  • Orion,

    Zitat

    Totaler Crash, DEADBEEF


    wer auf alles klickt, was nach einer ausführbaren Datei aussieht, dem gehört es nicht besser...
    Lasse diese Programme in einer DosBox oder auf einem 32-Bit BS (WindowsXP in einer VM ist immer gut^^) laufen^^

  • Zitat von Andy

    wer auf alles klickt, was nach einer ausführbaren Datei aussieht, dem gehört es nicht besser...

    :D Ja ich war neugierig :whistling:
    Wenns von dir kommt, wird es schon in Ordnung sein. :D

    Um Missverständnisse zu vermeiden, mein Name rührt vom Sternenbild und nicht vom Shop her :D


    Rainbow Dash :rock:

    "Das, wobei unsere Berechnungen versagen, nennen wir Zufall." (Albert Einstein)

  • Andy:

    So bekomme ich die Daten aus der Datenbank geliefert. [2] = Name de rOriginaldatei - [3] Die Binärdatei
    [Blockierte Grafik: http://goldise.go.ohost.de/ul/Array1.jpg]

    So sieht die Datei aus, nachdem sie im BINÄR-Modus geschrieben wurde:
    [Blockierte Grafik: http://goldise.go.ohost.de/ul/Schreib.jpg]

    so sieht die Datei aus, wenn man sie sich im Hex-Modus anschaut:
    [Blockierte Grafik: http://goldise.go.ohost.de/ul/Hex_Ansicht.jpg]


    Hier der komplette Code der das betrifft (ist ja nicht viel):

    Spoiler anzeigen
    [autoit]


    Case $HSQLExtract
    Local $hExtrFile, $sstrg
    Local $extrnr = InputBox("ID", "Welche Nummer extrahieren?", "110977", " M6")
    If $extrnr = "" then ContinueLoop
    Local $sqld = "SELECT TOP (1) pID, pOriginalname, pContent FROM PDF WHERE (pID = " & $extrnr & ")"
    $rQuery = $sqld
    $hDBConn = _SQL_Startup()
    _SQL_Connect($hDBConn, $1, $2, $3, $4)
    If IsObj($hDBConn) Then
    _SQL_GetTableAsString(-1, $rQuery, $resultstr, "|", 0)
    $aQResult = StringSplit($resultstr, "|")
    $resultstr = ""

    [/autoit] [autoit][/autoit] [autoit]

    $sstrg = StringToBinary($aQResult[3]); komplett unerheblich was ich nutze (Binary, Stringto....) - Resultat ist immer TExtausgabe in die Datei
    $hExtrFile = FileOpen(@ScriptDir & "\" & $aQResult[2] & ".pdf", 16+2) ;force Bin-Mode
    ;msgbox(0,"", IsBinary($sstrg)) ; hier zeigt er "1" an
    FileWrite($hExtrFile, $sstrg)
    FileClose($hExtrFile)
    Else
    MsgBox(1,"","Verbindung hat nicht funktioniert :-(")
    EndIf
    _SQL_Close($hDBConn)

    [/autoit]

    Die Datei ist gerade mal ~14kb groß, dies zeigt er auch bei beiden StringLen an.
    Die Originaldatei ahbe ich selber erstellt und in die DB einlesen lassen.Wenn ich aus deinem Post das ausführe mit Filewrite und im Quell-Code vorhandenen "0x...." - also niedergeschrieben, dann schreibt er das binär. Nur den übergebenen String nicht.

    Absolut nicht zu verstehen für mich.

    Einmal editiert, zuletzt von Torni (24. Juni 2013 um 12:51)

  • Hi,
    schreibe die Datei so wie der String kommt (also 0xABC2345F....) per
    filewrite (Dateiname, binarytostring($string))
    vorher noch ein filedelete($dateiname) und es sollte passen

    In deinem Script schreibst du nämlich im Binärmodus EINZELNE BYTES in deine Datei, daher stehen dort auch 0xFFABC2123FF07...drin.
    Wenn du die Datei in einem Viewer oder in Scite anschaust, sollte dort so etwas stehen "WVSU1‰ÆA‰ÈgA‹HA‰ÏgE‹HgE)

  • Hallo Andy,


    ich schreibe doch im vorigen Post im Quellcode mittels

    [autoit]


    $sstrg = StringToBinary($aQResult[3]); komplett unerheblich was ich nutze (Binary, Stringto....) - Resultat ist immer TExtausgabe in die Datei
    $hExtrFile = FileOpen(@ScriptDir & "\" & $aQResult[2] & ".pdf", 16+2) ;force Bin-Mode
    ;msgbox(0,"", IsBinary($sstrg)) ; hier zeigt er "1" an
    FileWrite($hExtrFile, $sstrg)

    [/autoit][autoit][/autoit][autoit][/autoit]

    schon StringtoBinary, Binarytostring die Datei. Alle drei Varianten ausprobiert. Der schreibt nicht binär. Hier was er übergeben bekommt einfach als MSGBOX ausgegeben:

    [Blockierte Grafik: http://goldise.go.ohost.de/ul/msgbox.jpg]

    Das ist der komplette Binärcode der Datei so wie er sein sollte und wie ich schreiben will. Einfach normal mit MsgBox ausgegeben ausgegeben.

    Wenn ich mir jetzt den String in Blöcke teile und das ganze mittels FilewriteLine/FileWrite schreibe (force binärmode), dann kommt seltsames heraus:

    Spoiler anzeigen
    [autoit]


    ...
    Local $aRet = StringRegExp ( $aQResult[3], '(.{1,4000})', 3 )
    FileDelete($hExtrFile)
    $hExtrFile = FileOpen(@ScriptDir & "\" & $aQResult[2] & ".pdf", 16+2)
    For $i = 0 to UBound($aRet) -1
    FileWriteLine($hExtrFile, $aRet[$i])
    Next
    FileClose($hExtrFile)

    [/autoit]


    [Blockierte Grafik: http://goldise.go.ohost.de/ul/ArrayWrite.jpg]

    Den 1.Block des String schreibt er binär und macht mit dem zweiten in Text weiter