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
相关产品推荐
相关产品推荐

