我通过将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的
答案 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。:局部变量应以小写字符开头。