读写二进制研究
本帖最后由 作者 于 2009-12-28 23:28:31 编辑 <br /><br /> <p>;Subject:binary conversion to text by lisp 二进制文件转文本<br/>;Writen:nonsmall(不死猫)<br/>;Date:2009 10 18<br/>;All Rights Reserved 版权所有 nonsmall(不死猫)<br/>;Contact: QQ:43797405 Email:nonsmall@163.com<br/>(defun binaryToText(FileName / ADODB.Stream)<br/> (Setq ADODB.Stream (Vlax-Get-Or-Create-Object "ADODB.Stream" ))<br/> (Vlax-Put-Property ADODB.Stream 'Type 1 )<br/> (Vlax-Invoke ADODB.Stream 'Open )<br/> (Vlax-Invoke-Method ADODB.Stream 'LoadFromFile FileName )<br/> (Vlax-Put-Property ADODB.Stream 'Position 0 )<br/> (Vlax-Invoke-Method ADODB.Stream 'Write (car (list (Vlax-Invoke-Method ADODB.Stream 'Read (Vlax-Get ADODB.Stream 'Size )) (Vlax-Put-Property ADODB.Stream 'Position 0 ))))<br/> (Vlax-Put-Property ADODB.Stream 'Position 0 )<br/> (Vlax-Put-Property ADODB.Stream 'Type 2 ) <br/> (Vlax-Put-Property ADODB.Stream 'CharSet "us-ascii" )<br/> (Vlax-Invoke ADODB.Stream 'ReadText)<br/> ;(vlax-release-object ADODB.Stream)<br/>)<br/></p><p>(defun _WriteStream ( path text mode / fso stream file result )</p><p> ;; Return the file size if the file is successfully written <br/> ;; to, otherwise nil. Will write all ascii chars to file<br/> ;; including nulls. If the caller wants to pass a list of<br/> ;; byte values to the function just call it like so:<br/> ;;<br/> ;; (_WriteStream <br/> ;; path <br/> ;; (vl-list->string '(87 111 111 116 33)) <br/> ;; mode<br/> ;; ) <br/> ;;<br/> ;; Arguments:<br/> ;;<br/> ;; path <duh><br/> ;; text <duh><br/> ;; mode "a" to create/append, <br/> ;; "w" to create/overwrite (default)<br/> <br/> (setq mode (if (member mode '("a" "A")) "a" "w"))<br/> <br/> (vl-catch-all-apply<br/> '(lambda ( / format )<br/> (setq fso (vlax-create-object "Scripting.FileSystemObject"))<br/> (cond<br/> ( (or (null (findfile path)) (eq "w" mode))<br/> (setq stream<br/> (vlax-invoke <br/> fso<br/> 'CreateTextFile <br/> path <br/> -1 ;; 0 (false) = don't overwrite , -1 (true) = overwrite<br/> 0 ;; 0 (false) = ascii, -1 (true) = unicode <br/> )<br/> )<br/> (setq file (vlax-invoke fso 'GetFile path))<br/> )<br/> ( (setq file (vlax-invoke fso 'GetFile path))<br/> (setq stream<br/> (vlax-invoke <br/> file<br/> 'OpenAsTextStream <br/> 8 ;; 1 = read, 2 = write, 8 = append<br/> 0 ;; 0 = ascii, -1 = unicode, -2 system default<br/> )<br/> ) <br/> )<br/> )<br/> (vlax-invoke stream 'Write text)<br/> (vlax-invoke stream 'Close)<br/> (setq result (vlax-get file 'Size))<br/> )<br/> )</p><p> (if file (vlax-release-object file))<br/> (if stream (vlax-release-object stream))<br/> (if fso (vlax-release-object fso))<br/> <br/> result<br/> <br/>)</p><p> </p><p>=========================================================</p><p>测试<font color="#ff0000">:(_writestream "d:\\jmj.sld" (vl-list->string (vl-string->list (binarytotext "d:\\bsph.sld"))) "w")</font></p><p></p><p> </p><p></p><p></p><p></p><p> </p><p><font color="#ff0000">生产的JMJ.SLD的值和原来的BSPH.SLD的值是一样的,文件大小也相等!</font></p><p></p><p>但是预览效果也不同,为什么</p><p><font color="#ff0000">bsph.SLD是这样的</font> </p><p></p><p><font color="#ff0000">而JMJ.SLD是这样的</font></p><p> </p> 你所用的程序在实际使用时是有问题的,这有老外做的读写二进制文件工具,很好用;加载后(注意07,08用ReadBin17.arx,05,06用ReadBin16.arx),用函数binget,binput即可。
以下为示例:
;读写幻灯片文件
(defun c:test2 ( / )
(setq a (binget "d:\\GB56.sld" ));读取二进制文件
(binput "d:\\GB56-1.sld" a );写二进制文件
)
(defun c:test3 ( / )
(binput "c:\\McCoy2.dwg" (binget "c:\\McCoy.dwg" ) )
) <p>应该还有一个“textToBinary”</p> 楼上能留下QQ吗?想进一步请教 <p>我也是花了三天时间,硬是没有找到正确的解决方法。</p><p>问我也无解。</p> 非常好,多谢 经试用,xianaihua 提供的方法的确好用! 5楼的方法很好用,唯一的缺点就是.arx也没办法一直打包到vlx中,用在别的电脑上需先加载ReadBin17.arx 学习一下怎么实现的
页:
[1]