You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 01:17:06