破帽遮颜 发表于 2009-11-30 21:44:07

怎么样读取文件(一些exe,jpg等)(非二进制方式)




类似这个exe文件,用文本工具读取出来的内容
使用au3的fileread没效(仅仅读取到几个字符而已)(貌似以前的版本OK?反正现在的版本是读取不了,二进制没问题,但我不需要二进制)
请教高手,怎么样才可以类似文本工具一样直接读取到这些文件,使用于POST

像这样:




请教各位高手给支个招~谢谢!

pusofalse 发表于 2009-11-30 22:05:43

用FileRead读取实际是全部读取出来了,但读取的数据中因为有NULL字符而显示不全。
测试以下代码便知,NULL字符之后的数据不会显示出来:
Msgbox(0, "", "a" & Chr(0) & "b")

解决方式是把NULL字符替换为其他字符,用DllStruct*系列的函数就可以做到了。

破帽遮颜 发表于 2009-12-1 00:12:50

本帖最后由 破帽遮颜 于 2009-12-1 00:15 编辑

:face (37):

pusofalse超版,有没具体点的方案?

如果说仅仅只是不显示倒也无所谓,问题是根本读取不了!
类似如此:

ClipPut(FileRead(@ScriptDir & '\工作进度.XLS'))

粘贴到文本后仅仅只是显示:"邢唷?"

pusofalse 发表于 2009-12-1 00:56:05

试下这样:
$sFile = "cmd.exe"

$hFile = FileOpen($sFile, 16)
$bBinary = FileRead($hFile)
FileClose($hFile)

$iSize = BinaryLen($bBinary)
$tBinary = DllStructCreate("byte Binary[" & $iSize & "]")
$pBinary = DllStructGetPtr($tBinary)
$tChar = DllStructCreate("char Data[" & $iSize & "]", $pBinary)
DllStructSetData($tBinary, "Binary", $bBinary)


Local $sVar, $sVal
For $i = 1 To $iSize
        $sVar = DllStructGetData($tChar, "Data", $i)
        If $sVar = Chr(0) Then
                $sVal &= Chr(7)
        Else
                $sVal &= $sVar
        EndIf
Next
Msgbox(0, "", $sVal)
对于exe文件,会非常费时。

破帽遮颜 发表于 2009-12-1 01:03:03

本帖最后由 破帽遮颜 于 2009-12-1 01:08 编辑

呵呵~很感谢pusofalse的帮助~马上测试一下~$sFile = "连接管理器.exe"

$hFile = FileOpen($sFile, 16)
$bBinary = FileRead($hFile)
FileClose($hFile)

$iSize = BinaryLen($bBinary)
$tBinary = DllStructCreate("byte Binary[" & $iSize & "]")
$pBinary = DllStructGetPtr($tBinary)
$tChar = DllStructCreate("char Data[" & $iSize & "]", $pBinary)
DllStructSetData($tBinary, "Binary", $bBinary)


Local $sVar, $sVal
For $i = 1 To $iSize
        $sVar = DllStructGetData($tChar, "Data", $i)
;~         If $sVar = Chr(0) Then
;~                 $sVal &= Chr(7)
;~         Else
                $sVal &= $sVar
;~         EndIf
Next

FileWrite(@ScriptDir & '\测试.exe', $sVal)
;~ Msgbox(0, "", $sVal)这代码转换后再次生成的exe无法使用了~呵呵!
应该post上传到服务器后也无法生成正确的exe文件吧,唉,头晕

pusofalse 发表于 2009-12-1 01:46:25

当然,把原始数据中的NULL字符改成Chr(7)了。

ljsoso 发表于 2009-12-1 08:11:26

先占个位置 现在的水平读不懂

文白 发表于 2009-12-1 17:01:40

首先从Http协议出发
头文件中的两行
Content-Type: multipart/form-data; boundary=---------------------------7d92af01205e8
Content-Length: 527

boundary=---------------------------7d92af01205e8
中的7d92af01205e8为随机生成
---------------------------7d92af01205e8
为数据分隔符
开头的7d表示由IE进行的上传

格式为:POST ... @CRLF
Content-Type: multipart/form-data; boundary=---------------------------7d92af01205e8 @CRLF
... @CRLF
Content-Length: 527@CRLF
... @CRLF
@CRLF
-----------------------------7d92af01205e8 @CRLF
Content-Disposition: form-data; name="..."; filename="..." @CRLF
Content-Type: application/octet-stream @CRLF
@CRLF
##使用FileOpen("", 16)读出的文件内容##
@CRLF
-----------------------------7d92af01205e8 @CRLF
Content-Disposition: form-data; name="..." @CRLF
@CRLF
...(表单数据) @CRLF
-----------------------------7d92af01205e8 @CRLF
Content-Disposition: form-data; name="..." @CRLF
@CRLF
@CRLF
-----------------------------7d92af01205e8-- @CRLF

文白 发表于 2009-12-1 17:09:51

1.建议以文件内容为界
##使用FileOpen("", 16)读出的文件内容##
将数据包分为三部分发送
2.使用循环发送读取$File = FileOpen("", 16)
$sValve = 1
While $sValve
$tFile = FileRead($sFile, 512)
If @error = -1 Then $sValve = 0
While BinaryLen($tFile)
$tFile = BinaryMid($tFile, TCPSend($Socket, $tFile)+1)
Wend
Wend3.发送剩余数据

l100593120 发表于 2009-12-5 12:59:15

学习下,留个脚印!~慢慢学习!~!~

amway929 发表于 2009-12-7 11:12:23

太深奥了,看不懂啦,再看下去就没有信心学下去了。。还是找些简单的开始学习!!

xz00311 发表于 2009-12-7 14:42:01

学习中但是还是看不懂
页: [1]
查看完整版本: 怎么样读取文件(一些exe,jpg等)(非二进制方式)