1

通过将 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());

PHPs HexDump 的结果是00 3C- 在 C# 中我得到34 39

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

\x00\x3c

问候,莫里茨

4

2 回答 2

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();
于 2012-05-29T21:09:36.587 回答
1

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

换行

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

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

请注意,在英特尔 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();

PS:局部变量应以小写字符开头。

于 2012-05-29T21:13:20.630 回答