猿问

既然"不"的编码是178,187,那么如何从178,187得到字符串"不"?

我做了两个程序:
第一个把一个普通文件(不是二进制,是用记事本就能打开的文件,但是里面有许多中文)和一些别的文件加密后保存到另一个二进制文件里;
第二个把加密后的文件边解密边读取信息,并不在硬盘上保存任何临时文件,直接将最原始的那个普通文件中的数据分离到内存中
原来是可以的,但要保存临时文件;现在想改进一下,不保存临时文件了直接读取,其中有几个关键的函数:
LInputQ函数:类似于Line Input #语句,却是从二进制文件中读取一行(以遇到Chr(13)为准);t = &HFF - t Xor Q是解密方法,Q是一个全局Byte变量
Public Function LInputQ(ByVal FileNumber As Integer) As String
Dim t As Byte
Get #FileNumber, , t
t = &HFF - t Xor Q
Do Until t = 13
LInputQ = LInputQ & Chr(t)
Get #FileNumber, , t
t = &HFF - t Xor Q
Loop
Get #FileNumber, , t
End Function
现在,当我用它(LInputQ)去读取英文时,很正常;但是,一旦遇到中文,就出问题了,返回值有问题,就像" "(四个空格)一样。
比如,原始文件内容为一个“不”字(它的Ascii是13,78),在读取时就变成了178,187不知道是怎么回事。
请大家帮忙,以下是第一个程序的关键代码:
(PB是进度条,Wname是是否写入名称(不管是否写入名称都出现以上问题))
Private Sub AppendMix(ByVal OutNumber As Integer, ByVal FileN As String, ByRef PGBR As ProgressBar, Optional Wname As Boolean = True, Optional k As Byte = &H7F)
Dim i As Long, fLen As Long, tmp As Byte, st As String * 64

Open FileN For Binary As #2

If Wname Then
st = Mid(FileN, InStrRev(FileN, "\") + 1) & String(128, " ")
Put #1, , st
End If

fLen = LOF(2)
Put #1, , CByte(Int(fLen / &H1000000))
Put #1, , CByte(Int(fLen / &H10000) Mod &H100)
Put #1, , CByte(Int(fLen / &H100) Mod &H100)
Put #1, , CByte(fLen Mod &H100)

PGBR.Max = fLen

For i = 1 To fLen
Get #2, , tmp
Put #1, , CByte((&HFF - tmp) Xor k)
PGBR.Value = i
Next i

Close #2
End Sub

慕勒3428872
浏览 159回答 3
3回答

慕尼黑5688855

下面是改进后的LInputQ函数,应该可以正确读取汉字字符的。Public Function LInputQ(ByVal FileNumber As Integer) As StringDim t As ByteGet #FileNumber, , tt = &HFF - t Xor QDo Until t = 13LInputQ = LInputQ & tGet #FileNumber, , tt = &HFF - t Xor QLoopGet #FileNumber, , tLInputQ = StrConv(LInputQ, vbUnicode)End Function

翻翻过去那场雪

Dim bytes() As Bytedim lLength as LongOpen "c:\main.exe" For Binary As #1 '读取字节lLength=LOF(1)ReDim bytes(1 To lLength) As ByteGet 1, , bytesClose #1'将文件以十六进制方式输出到Text1中,这个过程很耗时,130K的文件大概需要2分钟,而且越到后面速度越慢Dim strTmp As StringFor i = 1 To lLength  strTmp = strTmp & " " & Hex(bytes(i))DoEventsNextText1.Text = strTmpOpen "d:\abcd.exe" For Binary As #1 '将字节转存Put 1, , bytesClose #1End Sub 这个是以前用过的,你稍微改下就可以用了

吃鸡游戏

‘不’ 的16进制吗是 B2 BB单个字节换成十进制当然是178,187你的(Ascii是13,78)是如何得来的 ''''''''''''''''''''如何从178,187得到字符串"不"?:你把这两个字节按顺序写到文件里自然就是"不"字了你都把它拆成字节了还要还原干嘛,中文是以字为单位的VB的string类型确实很难理解像VB里的 ‘不A’是用3个字节储存的 ‘B2 BB 41’
随时随地看视频慕课网APP
我要回答