VB.Net字符串转ByteArray失败,求问题排查与解决思路
问题:Base64解码字节数组长度与TT10类要求不符的排查与解决
问题概述
接手老旧VB.Net应用时,遇到数据库中存储的Base64字符串解码为ByteArray后,长度为68,但TT10类的FromByteArray方法要求字节数组长度必须为62,导致TT10对象的SenderId、ReceiverId等属性均为0值。原数据通过Convert.ToBase64String存入数据库,且TT10所属库无调试符号,无法确认FromByteArray的实现是否被正确调用。
相关代码片段
解码业务代码
Dim sixthColumn As String = columns(5) If ... Then Dim test As TT10 = New TT10() ' Some internal object Dim testBytes As Byte() Dim result As String = "" Try testBytes = Convert.FromBase64String(sixthColumn) test.FromByteArray(Convert.FromBase64String(sixthColumn)) result = test.ToString(sixthColumn)
TT10的FromByteArray实现
Public Sub FromByteArray(ByVal bytes() As Byte) Implements ISrmTelegram.FromByteArray If bytes.Length <> 62 Then 'TODO: Error Else SenderId = bytes(0) ReceiverId = bytes(1) Type = bytes(2) Producer = bytes(3) ...
数据入库代码
Public Shared Sub AddTelegram(..., ByVal data() As Byte) Try Dim sInsert As String = "INSERT INTO Table_1 " sInsert &= ... sInsert &= "... @Data);" Dim oPar5 As New SqlParameter("@Data", Convert.ToBase64String(data))
数据库样本数据
RGZEOQf9yWYKyVhXAAAAAGYCABoFCwAAAABmAgABBAsAAAAAZgIAGgULAAIAAAYAgQBCMDA0NDcAAAAAAAAAAAAAAAA= RMlEOPYcZskKyVhXAAAAAGYCABoFCwAAAABmAgABBAsAAAAAZgIAAAAAAAIAFQYAgQBCMDA0NDcAAAAAAAAAAAAAAAA= RMlEMPfaZskKyVhXAAAAAGYCABoFCwAAAABmAgABBAsAAAAAZgIAAQQLAAIAAQYAgQBCMDA0NDcAAAAAAAAAAAAAAAA= RGZEM4f6yWYKyVhYAAAAAGYCABIDCwAAAABmAgABBAsAAAAAZgIAEgMLAAIAAAYAgQBCMDA2NDYAAAAAAAAAAAAAAAA= RMlENPYZZskKyVhYAAAAAGYCABIDCwAAAABmAgABBAsAAAAAZgIAAAAAAAIAFQYAgQBCMDA2NDYAAAAAAAAAAAAAAAA= RMlENnfYZskKyVhYAAAAAGYCABIDCwAAAABmAgABBAsAAAAAZgIAAQQLAAIAAQYAgQBCMDA2NDYAAAAAAAAAAAAAAAA= RGZEOMY9yWYKyVhZAAAAAGYCAAICFQAAAABmAgABBAsAAAAAZgIAAgIVAAIAAAYAgQBCMDA0NjAAAAAAAAAAAAAAAAA=
排查思路
- 验证Base64字符串完整性:检查数据库中存储的字符串是否存在额外字符(空格、换行、截断),或入库时是否被篡改。可直接对样本Base64解码,确认原始字节长度是否为68,对比预期62找出差异字节。
- 确认入库原始字节长度:检查
AddTelegram方法传入的data参数长度是否为62,排查转Base64前是否被追加冗余字节(如日志、额外字段)。 - 排查方法调用歧义:通过反射查看TT10类是否存在多个
FromByteArray重载,或是否实现其他接口的同名方法,导致调用的不是预期实现。 - 检查编码一致性:确认入库和出库使用的Base64转换逻辑是否一致,是否存在自定义编码/解码规则而非系统默认的
Convert类方法。 - 分析样本解码结果:手动解码提供的样本Base64字符串,查看字节数组具体内容,判断是否存在固定冗余字节段,确认是入库多存数据还是解码后需截取有效部分。
解决方法
- 修复篡改的Base64数据:若数据库中字符串被篡改,修正数据并检查入库流程(如字符串截断、编码转换错误)。
- 追溯入库数据源头:确认
AddTelegram调用时传入的data是否为正确的TT10序列化结果,避免传入含冗余数据的数组。 - 显式指定接口实现:调用
FromByteArray时,通过DirectCast(test, ISrmTelegram).FromByteArray(testBytes)显式指定接口方法,确保调用预期实现。 - 截取有效字节段:若解码后存在固定冗余字节,可截取有效部分(如
bytes.Skip(6).Take(62).ToArray(),需根据实际冗余位置调整)再传入FromByteArray。 - 统一Base64规则:若使用自定义Base64规则,确保解码使用与入库相同的逻辑(如字符替换、填充方式)。
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

