如何将字符串转为16位大端整数?C#实现NuVotifier遇阻
解决C#中NuVotifier协议16位大端整数处理问题
问题根源分析
你的代码存在两个核心问题,导致不符合协议要求:
- 0x733A是16位无符号整数,你用
Convert.ToInt32转成32位整数后,EndianBitConverter会生成4字节数组,但协议只需要2字节的大端数据。 - JSON消息长度用
long类型处理,会生成8字节数组,同样不符合协议要求的16位长度规范。
修正后的代码(基于EndianBitConverter)
直接使用16位无符号整数类型ushort来处理,确保生成2字节的大端数组:
// 协议要求的16位大端魔术值0x733A,直接用十六进制字面量赋值 ushort magicCode = 0x733A; byte[] magicBytes = EndianBitConverter.BigEndian.GetBytes(magicCode); // 将JSON长度转换为16位无符号整数(需确保长度不超过65535,符合协议限制) ushort jsonLength = (ushort)output.Length; byte[] lengthBytes = EndianBitConverter.BigEndian.GetBytes(jsonLength); // 拼接完整消息:魔术值 + 长度 + JSON内容 byte[] fullMessage = magicBytes.Concat(lengthBytes).Concat(Encoding.UTF8.GetBytes(output)).ToArray();
替代方案:手动实现16位大端转换
如果不想依赖第三方NuGet包,可以手动处理字节顺序:
// 手动将ushort转换为大端字节数组 byte[] ToBigEndian(ushort value) { return new byte[] { (byte)(value >> 8), // 高8位 (byte)(value & 0xFF) // 低8位 }; } // 使用示例 byte[] magicBytes = ToBigEndian(0x733A); byte[] lengthBytes = ToBigEndian((ushort)output.Length);
关键注意事项
- 必须确保JSON内容的长度不超过
ushort的最大值(65535),否则会出现溢出错误,这也是NuVotifier协议的规定。 - 避免用字符串转整数的方式处理十六进制值,直接用
0x733A字面量更高效且不易出错。
内容的提问来源于stack exchange,提问作者poofit
相关产品推荐
相关产品推荐

