找回密码
 加入
搜索
查看: 3435|回复: 8

[AU3基础] [已解决]在将十六进制字符串写磁盘时,用BinaryToString转换后丢失部分字符

  [复制链接]
发表于 2012-3-9 09:29:12 | 显示全部楼层 |阅读模式
本帖最后由 iPAQ 于 2012-3-9 13:54 编辑

我想要将一组十六进制字符串数据写入到磁盘。

在写入过程中,转换时发现经过BinaryToString转换后部分十六进制数变成ASCII码时丢失。

请问是我哪里写错了,还是其他问题?如果这种转换不可靠,有无其他办法写入十六进制字符串?

下面是测试用的部分代码:
;十六进制字符串转ASCII测试
;$Hex="FFFEFDFCFBFA9998979695FFFF"
$Hex=""
For $i = 255 To 1 Step -1
        $Hex=$Hex & Hex($i,2)
Next
MsgBox(0,"10","<[" & $Hex & "]> len=" & StringLen($Hex) & @CRLF & "<[" & BinaryToString("0x" & $Hex,1) & "]> len=" & StringLen(BinaryToString("0x" & $Hex,1)) & @CRLF & "<[" & StringTrimLeft(Binary(BinaryToString("0x" & $Hex,1)),2) & "]> len=" & StringLen(StringTrimLeft(Binary(BinaryToString("0x" & $Hex,1)),2)))
;StringLen将每两个高位ASCII码当做中文字符计算个数。
$Str=BinaryToString("0x" & $Hex,1)
$SecN=1
$tBuffer = DllStructCreate("byte[" & 512*$SecN & "]")
DllStructSetData($tBuffer, 1, $Str)
MsgBox(4096,"set DllStruct","数据结构大小: " & DllStructGetSize($tBuffer) & @CRLF & "数据结构指针: " & DllStructGetPtr($tBuffer) & @CRLF & "Data:" & @CRLF & DllStructGetData($tBuffer, 1))

;然后用下面函数写入磁盘,这里为防误写磁盘注释掉
;_WinAPI_WriteFile($hDisk, DllStructGetPtr($tBuffer), 512*$SecN, $nBytes)
从MsgBox显示的情况就能看到问题。
经过几次试验,发现丢失的字符不是特定字符,而是字符串被剪裁掉了一段。想不明白原因。

评分

参与人数 1金钱 +15 收起 理由
afan + 15 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2012-3-9 10:24:13 | 显示全部楼层
你在用复杂的方法来实现简单的功能。
$Hex = "CED2B0AED6D0B9FA";我爱中国
FileWrite(@ScriptDir&"\temp.txt", Binary('0x' & $Hex))

评分

参与人数 1金钱 +15 收起 理由
afan + 15

查看全部评分

 楼主| 发表于 2012-3-9 10:40:50 | 显示全部楼层
本帖最后由 iPAQ 于 2012-3-9 12:09 编辑

多谢LS朋友提醒!

是让我弄复杂了,没想到FileWrite也可以直接写磁盘,就是用FileRead和FileSetPos遇到点问题,正在试验。用_WinAPI_SetFilePointerEx和_WinAPI_ReadFile没问题。
就是打开磁盘时只敢用_WinAPI_CreateFileEx,不知道如果用FileOpen写磁盘时会怎么样。

另外把我的代码中的BinaryToString()换成Binary()读写时直接写数据就行,不转换成ASCII就不丢失字符了。


不过BinaryToString()转一下为啥丢字符还是不清楚。
发表于 2012-3-9 10:48:52 | 显示全部楼层
$tBuffer = DllStructCreate("WCHAR[" & 512*$SecN & "]")
 楼主| 发表于 2012-3-9 11:16:34 | 显示全部楼层
本帖最后由 iPAQ 于 2012-3-9 12:06 编辑

谢谢3mile回复!

没看明白把byte换成wchar有何用意?
我发现只是数据由1个字节变成2个字节了。照样丢字符。是BinaryToString转换时丢的不是$tBuffer装不下丢的。和我这段程序出的问题好像不是一回事。
发表于 2012-3-9 11:20:14 | 显示全部楼层
学习了  用这个方法能改写mbr不?
 楼主| 发表于 2012-3-9 11:27:02 | 显示全部楼层
用_WinAPI_ 打开 移动指针位置 等 能写MBR,用Autoit自己内置函数还没试成功。
发表于 2012-3-9 13:54:38 | 显示全部楼层
也许是我没有理解楼主的意思.

;十六进制字符串转ASCII测试
#INCLUDE <ARRAY.AU3>

$Hex="FFFEFDFCFBFA9998979695FFFF"
;~ $Hex=""
;~ For $i = 255 To 1 Step -1
;~         $Hex=$Hex & Hex($i,2)
;~ Next
;~ MsgBox(0,"10","<[" & $Hex & "]> len=" & StringLen($Hex) & @CRLF & "<[" & BinaryToString("0x" & $Hex,1) & "]> len=" & StringLen(BinaryToString("0x" & $Hex,1)) & @CRLF & "<[" & StringTrimLeft(Binary(BinaryToString("0x" & $Hex,1)),2) & "]> len=" & StringLen(StringTrimLeft(Binary(BinaryToString("0x" & $Hex,1)),2)))

Local $ARRAY[4][6]
$ARRAY[0][0]="原始数据:FFFEFDFCFBFA9998979695FFFF"
$ARRAY[0][1]=$Hex
$ARRAY[0][2]=Binary("0x"&$Hex)
$ARRAY[0][3]=BinaryToString(Binary("0x"&$Hex))

$ARRAY[1][0]="原始数据:FFFEFDFCFBFA9998979695FFFF"
$ARRAY[1][1]="$Hex(字符形式)长度:"&StringLen($Hex)
$ARRAY[1][2]="二进制长度:"&BinaryLen("0x"&$Hex)
$ARRAY[1][3]="转字符串后长度:"&StringLen(BinaryToString(Binary("0x"&$Hex)))

$ARRAY[2][0]="Wchar"
$ARRAY[3][0]="Byte"

$Str=BinaryToString("0x" & $Hex,1)
;StringLen将每两个高位ASCII码当做中文字符计算个数。
$SecN=1
$tBuffer = DllStructCreate("wchar[" & 512*$SecN & "]")
DllStructSetData($tBuffer, 1, StringToBinary($Str))

$tBuffer1 = DllStructCreate("byte[" & 512*$SecN & "]")
DllStructSetData($tBuffer1, 1, $Str)

$ARRAY[2][1]="数据结构大小: " & DllStructGetSize($tBuffer)
$ARRAY[2][2]="数据结构指针: " & DllStructGetPtr($tBuffer)
$ARRAY[2][3]="结构中数据:" & DllStructGetData($tBuffer, 1)
$ARRAY[2][4]="结构中数据字符串:" & BinaryToString(DllStructGetData($tBuffer, 1))
$ARRAY[2][5]="结构字串长度: " & StringLen(BinaryToString(DllStructGetData($tBuffer, 1)))

$ARRAY[3][1]="数据结构大小: " & DllStructGetSize($tBuffer1)
$ARRAY[3][2]="数据结构指针: " & DllStructGetPtr($tBuffer1)
$ARRAY[3][3]="结构中数据:" & DllStructGetData($tBuffer1, 1)
$ARRAY[3][4]="结构中数据字符串:" & BinaryToString(DllStructGetData($tBuffer1, 1))
$ARRAY[3][5]="结构字串长度: " & StringLen(BinaryToString(DllStructGetData($tBuffer1, 1)))
_ArrayDisplay($ARRAY)
;然后用下面函数写入磁盘,这里为防误写磁盘注释掉
;_WinAPI_WriteFile($hDisk, DllStructGetPtr($tBuffer), 512*$SecN, $nBytes)

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

 楼主| 发表于 2012-3-9 21:17:29 | 显示全部楼层
本帖最后由 iPAQ 于 2012-3-9 21:25 编辑

感谢 3mile 具体详细的答复!

我比较笨,之前没明白你此处修改的用意。

执行了具体代码后看到wchar 和 byte 确实有区别。
但感觉造成转换时丢字符主要是 DllStructSetData($tBuffer, 1, StringToBinary($Str)) 和 DllStructSetData($tBuffer, 1, $Str) 这两句不同产生的。

再试发现:
Binary(BinaryToString("0x" & $Hex,1)) 丢字符
StringToBinary(BinaryToString("0x" & $Hex,1)) 不丢字符

一时脑筋还没转过来弯,让我慢慢想想差哪了。

再次谢谢答复!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-12 23:57 , Processed in 0.079253 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表