You need to enable JavaScript to run this app. C# .NET 4.5下如何将前端传入的UintArray字符串转数组并解码
优惠活动
大模型
产品
解决方案
定价
更多

C# .NET 4.5下如何将前端传入的UintArray字符串转数组并解码

实现可行性与具体方案

该操作完全可以在.NET Framework 4.5环境下简便实现,整体流程分为二次序列化字符串清洗、键值对结构解析、按索引排序生成纯字节数组、后续解码四个步骤,不需要引入重型第三方依赖。

关键注意事项

  • 解析时必须将JSON中的字符串类型索引转为整数后做升序排序,不能直接按字典键的遍历顺序取值:如果直接按字符串排序,会出现"10"排在"2"前面的乱序问题,最终导致字节内容错位。
  • 当前收到的入参外层多包裹了一层转义引号,属于二次序列化的结构,需要先做格式清洗才能正常解析。

无额外依赖的原生实现(适配.NET Framework 4.5)

注意:使用内置解析器前,需要在项目中添加对系统程序集System.Web.Extensions的引用,该程序集由.NET Framework 4.5原生提供,无需额外下载。

仅需引用该程序集下的JavaScriptSerializer类,即可完成解析,不需要安装任何Nuget包,实现代码如下:

using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;

public static class UintArrayParser
{
    /// <summary>
    /// 从前端传递的序列化字符串生成纯数值byte数组(对应前端Uint8Array)
    /// </summary>
    /// <param name="rawInput">前端传递的原始序列化字符串</param>
    /// <returns>不带索引的纯字节数组</returns>
    public static byte[] ParseToPureByteArray(string rawInput)
    {
        if (string.IsNullOrWhiteSpace(rawInput))
            return new byte[0];

        // 清洗二次序列化的外层引号与转义字符
        var cleanedJson = rawInput.Trim('"').Replace("\\\"", "\"");

        // 反序列化键值对
        var serializer = new JavaScriptSerializer();
        var keyValueMap = serializer.Deserialize<Dictionary<string, int>>(cleanedJson);

        // 提取所有有效索引并按数值升序排序
        var sortedIndexes = new List<int>();
        foreach (var key in keyValueMap.Keys)
        {
            if (int.TryParse(key, out int index))
            {
                sortedIndexes.Add(index);
            }
        }
        sortedIndexes.Sort();

        // 按顺序生成纯字节数组
        var result = new byte[sortedIndexes.Count];
        for (int i = 0; i < sortedIndexes.Count; i++)
        {
            var keyStr = sortedIndexes[i].ToString();
            result[i] = (byte)keyValueMap[keyStr];
        }

        return result;
    }
}

已引入Newtonsoft.Json的简化实现

如果项目已经引入支持.NET 4.5版本的Newtonsoft.Json(12.0.3及更早版本均可兼容),解析逻辑可以进一步简化:

using Newtonsoft.Json.Linq;

public static byte[] ParseWithNewtonsoft(string rawInput)
{
    var cleanedJson = rawInput.Trim('"').Replace("\\\"", "\"");
    var jsonObj = JObject.Parse(cleanedJson);

    // 按索引数值排序后生成字节数组
    return jsonObj.Properties()
        .Select(prop => int.Parse(prop.Name))
        .OrderBy(index => index)
        .Select(sortedIndex => (byte)jsonObj[sortedIndex.ToString()])
        .ToArray();
}

后续解码操作

生成的byte[]就是完全不带索引的纯数值序列,可以直接按照业务规则解码,比如解码为UTF8字符串的逻辑非常直接:

// 调用解析方法拿到纯字节数组
var byteArray = UintArrayParser.ParseToPureByteArray(接收到的原始前端字符串);
// 按UTF8编码解码为文本
var decodedText = System.Text.Encoding.UTF8.GetString(byteArray);

内容的提问来源于stack exchange,提问作者JimmyB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 10:54:04