Encoding Base64使用Stream_StringToBinary编码插入新行,是否中断字符串?
也许我疯了,但看起来在VB中运行Base64的著名代码在第73位插入了一个换行符(ascii 10),这会导致编码字符串对于基本身份验证无效,或者其他任何情况 原始代码:Encoding Base64使用Stream_StringToBinary编码插入新行,是否中断字符串?,encoding,vbscript,base64,Encoding,Vbscript,Base64,也许我疯了,但看起来在VB中运行Base64的著名代码在第73位插入了一个换行符(ascii 10),这会导致编码字符串对于基本身份验证无效,或者其他任何情况 原始代码: Function Stream_StringToBinary(Text) Const adTypeText = 2 Const adTypeBinary = 1 'Create Stream object Dim BinaryStream 'As New Stream Set BinaryStream =
Function Stream_StringToBinary(Text)
Const adTypeText = 2
Const adTypeBinary = 1
'Create Stream object
Dim BinaryStream 'As New Stream
Set BinaryStream = CreateObject("ADODB.Stream")
'Specify stream type - we want To save text/string data.
BinaryStream.Type = adTypeText
'Specify charset For the source text (unicode) data.
BinaryStream.CharSet = "us-ascii"
'Open the stream And write text/string data To the object
BinaryStream.Open
BinaryStream.WriteText Text
'Change stream type To binary
BinaryStream.Position = 0
BinaryStream.Type = adTypeBinary
'Ignore first two bytes - sign of
BinaryStream.Position = 0
'Open the stream And get binary data from the object
Stream_StringToBinary = BinaryStream.Read
Set BinaryStream = Nothing
End Function
Function Base64Encode(sText)
Dim oXML, oNode
Set oXML = CreateObject("Msxml2.DOMDocument.3.0")
Set oNode = oXML.CreateElement("base64")
oNode.dataType = "bin.base64"
oNode.nodeTypedValue =Stream_StringToBinary(sText)
Base64Encode = oNode.text
Set oNode = Nothing
Set oXML = Nothing
End Function
'------------------- and here goes the encoding -----------------------
strEnc = Base64Encode( "AVERYLONGUSERNAMEHELLOTHE123:AVERYLONGPASSWORDWHYAREYOUSOLONGREALLYANNOY123")
'----------------------------------------------------------------------
结果:
qvzfullmt05hvnfuk5btuviruxmt1rrteymzpbvkvwuxptkdqvntv09srfdiwufsrvlp
VVnpte9or1JfquxMwufotk9zmitz
看起来这种情况发生在很长的UID/PWD对上
有人遇到过这种情况吗?这是因为Base64编码处理长字符串的方式 从
编码后的输出流必须以行表示 每个字符不超过76个。所有换行符或其他字符均不可用 解码软件必须忽略表1中的内容。在base64中 数据、表1以外的字符、换行符和其他 空白可能表示传输错误,而 警告消息或甚至拒绝消息可能是合适的 在某些情况下 因为它是在编码后添加
vbLf
(Chr(10)
)意味着您可以使用
strEnc = Replace(strEnc, vbLf, "")
有些语言有一个“no wrapping”参数,可以通过它来停止在第76个字符后添加换行符,但我不知道在Microsoft XMLDOM实现中有这样一个参数,这里指出,它看起来像是建议的,但没有证据表明它曾经被实现过。。我不明白为什么微软会在73号插入一个中断。我花了相当长的时间在SSL上的基本身份验证失败上,却发现了使其成为字符串的特殊字符。@access\u承认这是一个奇怪的字符,老实说,我猜他们不想超过76个字符的最大值,所以决定将其改为72个字符。Base64编码不限制行长度。76个字符的限制和您引用的RFC属于MIME。相反,必须引用,特别是。另一方面,72字限制是打字机时代遗留下来的一项历史性实践。有趣的是,您可以检查这些RFC文件中的最大行长。@access\u MSXML的
bin.base64
是一种MIME编码样式。因此,这是一种预期行为(72或76无关紧要),替换vbLf
s就行了。我认为你应该把答案记为已接受。