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

如何将PHP的pack()函数转换为C#实现FastCGI协议Payload?

PHP FastCGI的pack()函数转C#实现方案

原始PHP代码

<?php
// 来自FCGI协议实现
function packPayload()
{
    return pack("nCa5", 1, 0, "");
}

echo json_encode(packPayload());

PHP pack格式说明

  • n:无符号短整型(固定16位,大端字节序)
  • C:无符号字符
  • a:空字节(NUL)填充的字符串

C#实现遇到的问题及解决方案

问题1:n格式处理结果不符

  • 现象:使用Encoding.Unicode.GetString(BitConverter.GetBytes((ushort)1))序列化后得到\u0000,不符合预期
  • 原因:FastCGI基于ASCII字节流而非UTF-16编码;且BitConverter默认用小端字节序,和PHP要求的大端规则冲突
  • 解决:手动转换为大端字节数组,用Encoding.ASCII处理:
    ushort nValue = 1;
    byte[] nBytes = new byte[] { (byte)(nValue >> 8), (byte)(nValue & 0xFF) }; // 大端转换
    string nStr = Encoding.ASCII.GetString(nBytes);
    

问题2:C格式出现歧义调用错误

  • 现象:Encoding.Unicode.GetString(BitConverter.GetBytes((byte)0))编译报错
  • 原因:无需依赖BitConverter,直接构造字节数组更简洁且避免重载歧义
  • 解决:直接创建单字节数组并转ASCII字符串:
    string cStr = Encoding.ASCII.GetString(new byte[] { 0x00 });
    

问题3:a5格式实现验证

  • 你的思路正确:空字符串填充5个NUL字节,直接构造5长度的空字节数组即可:
    string a5Str = Encoding.ASCII.GetString(new byte[5]);
    

完整C#实现代码

using System.Text;
using System.Text.Json;
using System.Linq;

public static class FastCgiHelper
{
    public static string PackPayload()
    {
        // 处理n格式:大端16位无符号短整型(值1)
        ushort nValue = 1;
        byte[] nBytes = new byte[] { (byte)(nValue >> 8), (byte)(nValue & 0xFF) };
        
        // 处理C格式:无符号字符(值0)
        byte[] cBytes = new byte[] { 0x00 };
        
        // 处理a5格式:空字符串填充5个NUL字节
        byte[] a5Bytes = new byte[5];
        
        // 合并所有字节数组
        byte[] totalBytes = nBytes.Concat(cBytes).Concat(a5Bytes).ToArray();
        
        // 转换为ASCII字符串(保留空字节)
        return Encoding.ASCII.GetString(totalBytes);
    }
}

// 测试示例
string payload = FastCgiHelper.PackPayload();
string jsonResult = JsonSerializer.Serialize(payload);
Console.WriteLine(jsonResult);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:56:07