搜索PHP函数的等价物

时间:2012-05-29 20:31:26

标签: c# function hex ascii

我通过将Integer转换为String格式来解决一些问题。我得到了这些PHP函数,这正是我在C#中所需要的:

function _hex($int)
{
    return (strlen(sprintf("%X", $int)) % 2 == 0) ? sprintf("%X", $int) : sprintf("0%X",     $int);
}
Function hex2str($hexstr)
{
    $hexstr = str_replace(' ', '', $hexstr);
    $hexstr = str_replace('\x', '', $hexstr);
    $retstr = pack('H*', $hexstr);
    return $retstr;
}

他们被召唤:

$total_length = hex2str(_hex(strlen($content)));

在C#中我尝试了这个:

String test = "1234567890123456789012345678901234567890123456789";
short l = (short)test.Length;
byte[] TotalLength = Encoding.GetEncoding(28591).GetBytes(l.ToString());

PHP Hexrump的结果是00 3C - 在C#中我获得34 39

我希望结果为这种格式的字符串:

\x00\x3c

问候, Moritz的

2 个答案:

答案 0 :(得分:1)

根据您的示例代码,值34/39是输出字节的正确格式十六进制数字,所以我不确定您是如何想出00 / 3C的。

但是要在C#中将数值转换为十六进制字符串,请使用;

string hex = String.Format("{0:X}", number);

或者在更具体的情况下;

StringBuilder sb = new StringBuilder();
foreach (byte b in TotalLength)
{
    sb.Append(String.Format("\x{0:X}", b));
}
string hex = sb.ToString();

答案 1 :(得分:1)

您的代码返回转换为字符串的l值的ASCII值(ASCII 34/39为49 - 字符串的长度)。但你需要的是长度值的byte []表示。

更改行

byte[] TotalLength = Encoding.GetEncoding(28591).GetBytes(l.ToString());

byte[] TotalLength = BitConverter.GetBytes(l);

请注意,在intel CPU上,值15转换为0F-00而不是00-0F。高字节首先出现。将字节数组转换为字符串时,必须注意这一点。

要将字节值转换为十六进制字符串,请使用

var sb = new StringBuilder();
for (int i = TotalLength.Length - 1; i >= 0; i--)
{
    sb.Append("\\x");
    sb.Append(TotalLength[i].ToString("x2"));
}
string hex = sb.ToString();

P.S。:局部变量应以小写字符开头。