为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕勒3428872 2023-04-22 17:13:06
我做了两个程序:第一个把一个普通文件(不是二进制,是用记事本就能打开的文件,但是里面有许多中文)和一些别的文件加密后保存到另一个二进制文件里;第二个把加密后的文件边解密边读取信息,并不在硬盘上保存任何临时文件,直接将最原始的那个普通文件中的数据分离到内存中原来是可以的,但要保存临时文件;现在想改进一下,不保存临时文件了直接读取,其中有几个关键的函数:LInputQ函数:类似于Line Input #语句,却是从二进制文件中读取一行(以遇到Chr(13)为准);t = &HFF - t Xor Q是解密方法,Q是一个全局Byte变量Public Function LInputQ(ByVal FileNumber As Integer) As StringDim t As ByteGet #FileNumber, , tt = &HFF - t Xor QDo Until t = 13LInputQ = LInputQ & Chr(t)Get #FileNumber, , tt = &HFF - t Xor QLoopGet #FileNumber, , tEnd 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 * 64Open FileN For Binary As #2If Wname Thenst = Mid(FileN, InStrRev(FileN, "\") + 1) & String(128, " ")Put #1, , stEnd IffLen = 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 = fLenFor i = 1 To fLenGet #2, , tmpPut #1, , CByte((&HFF - tmp) Xor k)PGBR.Value = iNext iClose #2End Sub
查看完整描述

3 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

下面是改进后的LInputQ函数,应该可以正确读取汉字字符的。

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 & t
Get #FileNumber, , t
t = &HFF - t Xor Q
Loop
Get #FileNumber, , t
LInputQ = StrConv(LInputQ, vbUnicode)
End Function

查看完整回答
反对 回复 2023-04-25
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

Dim bytes() As Byte
dim lLength as Long
Open "c:\main.exe" For Binary As #1 '读取字节
lLength=LOF(1)
ReDim bytes(1 To lLength) As Byte
Get 1, , bytes
Close #1

'将文件以十六进制方式输出到Text1中,这个过程很耗时,130K的文件大概需要2分钟,而且越到后面速度越慢
Dim strTmp As String
For i = 1 To lLength  
strTmp = strTmp & " " & Hex(bytes(i))
DoEvents
Next
Text1.Text = strTmp

Open "d:\abcd.exe" For Binary As #1 '将字节转存
Put 1, , bytes
Close #1

End Sub 

这个是以前用过的,你稍微改下就可以用了

查看完整回答
反对 回复 2023-04-25
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

‘不’ 的16进制吗是 B2 BB
单个字节换成十进制当然是178,187
你的(Ascii是13,78)是如何得来的 

''''''''''''''''''''
如何从178,187得到字符串"不"?:

你把这两个字节按顺序写到文件里自然就是"不"字了
你都把它拆成字节了还要还原干嘛,中文是以字为单位的
VB的string类型确实很难理解
像VB里的 ‘不A’是用3个字节储存的 ‘B2 BB 41’

查看完整回答
反对 回复 2023-04-25
  • 3 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信