如何在C#中实现Python to_bytes方法的同等编码效果
C# 实现Python
to_bytes 等效功能的方案 你需要的是将整数按指定长度、指定字节序转为字节数组,和Python (72).to_bytes(SIZEOF_INT,'little') 返回的b'H\x00\x00\x00'完全一致,可按以下方式实现:
1. 核心字节数组转换实现
首先实现通用的整数转字节数组扩展方法,完全对齐Python to_bytes 的字节序、长度适配逻辑:
using System; using System.Linq; public static class IntByteExtensions { /// <summary> /// 等效Python int.to_bytes(length, byteorder) 方法 /// </summary> /// <param name="value">待转换的整数</param> /// <param name="length">输出字节数组的长度</param> /// <param name="isLittleEndian">是否使用小端字节序</param> /// <returns>转换后的字节数组</returns> public static byte[] ToBytes(this int value, int length, bool isLittleEndian) { byte[] rawBytes = BitConverter.GetBytes(value); // 适配目标字节序 if (BitConverter.IsLittleEndian != isLittleEndian) { Array.Reverse(rawBytes); } // 截取指定长度,对齐Python截断低位/高位的逻辑 return isLittleEndian ? rawBytes.Take(length).ToArray() : rawBytes.Skip(rawBytes.Length - length).Take(length).ToArray(); } }
调用示例(对应你给出的Python场景)
const int SIZEOF_INT = 4; byte[] result = 72.ToBytes(SIZEOF_INT, isLittleEndian: true); // result 内容为 [0x48, 0x00, 0x00, 0x00],和Python返回的字节数组完全一致
2. 可选:输出Python风格的bytes字面量字符串
如果需要得到和Python打印输出完全一致的b'H\x00\x00\x00'格式的字符串,可以额外加格式化方法:
using System.Text; public static class ByteFormatExtensions { public static string ToPythonBytesLiteral(this byte[] bytes) { StringBuilder sb = new StringBuilder("b'"); foreach (byte b in bytes) { // 可打印ASCII字符直接输出,不可打印字符转为\x十六进制格式 if (b is >= 32 and <= 126) { sb.Append((char)b); } else { sb.Append($"\\x{b:X2}".ToLower()); } } sb.Append("'"); return sb.ToString(); } }
调用示例
Console.WriteLine(result.ToPythonBytesLiteral()); // 输出结果:b'H\x00\x00\x00'
注意事项
- 如果需要处理无符号整数、long等其他数值类型,只需修改扩展方法的入参类型即可,逻辑通用
- 若要完全对齐Python的溢出校验逻辑,可以在扩展方法中增加数值范围校验:当指定长度无法容纳当前数值时抛出
OverflowException - 当指定长度大于数值实际所需字节数时,方法会自动补0,和Python行为一致
内容的提问来源于stack exchange,提问作者SirTastyWaffle
相关产品推荐
相关产品推荐

