简体   繁体   English

如何将操作和字节数组转换为十六进制字符串?

[英]How do you convert a operation and byte array to a hexadecimal string?

I try to reverse that code.我尝试反转该代码。

var val = FormatFingerOp(BitConverter.ToString(Convert.FromBase64String("EcE4Zodu3wRTBXntCdUvifj+/GggA3DnG6zEKRZGpcY=")));

FormatFingerOp do that thing: FormatFingerOp 做那件事:

var fp = "";
string[] keys = val.Split('-');
for (int i = 1; i <= keys.Length; i++)
{
    fp += keys[i - 1];
    if (i % 2 == 0)
        fp += " ";
}

I try that but it doestn work.我试过了,但它不起作用。 I try to reverse this steps like that:我尝试像这样扭转这些步骤:

string xsonuc = "";

for (int i = 1; i <= fp.Length; i++)
{
    xsonuc += fp[i - 1];
    if (i % 2 == 0)
        xsonuc += "-";
}


int NumberChars = val.Length;
byte[] ysonuc = new byte[NumberChars / 2];
for (int i = 0; i < NumberChars; i += 2)
    ysonuc[i / 2] = Convert.ToByte(val.Substring(i, 2), 16);

I would argue that in general case this is not reversible, FormatFingerOp will concatenate pairs of keys into one entry, ie "one-three" will become ".nethree" so if you don't have any prior knowledge of key structure (like fixed length or something) - you can't reverse it.我认为在一般情况下这是不可逆的, FormatFingerOp会将成对的键连接成一个条目,即"one-three"将变成".nethree" ,所以如果你没有任何关于键结构的先验知识(比如固定的长度或其他东西) - 你不能扭转它。

As for your code - note that FormatFingerOp iterates array of strings, while it seems that your are trying to iterate the string itself (for starters you need to "reverse" new separator " " - so fp.Split(" ") ).至于您的代码 - 请注意FormatFingerOp迭代字符串数组,而您似乎正在尝试迭代字符串本身(对于初学者,您需要“反转”新分隔符" " - 所以fp.Split(" ") )。

UPD更新程序

Try the following:尝试以下操作:

var original = "EcE4Zodu3wRTBXntCdUvifj+/GggA3DnG6zEKRZGpcY=";
var val = BitConverter.ToString(Convert.FromBase64String(original));
var fp = "";
string[] keys = val.Split('-');
for (int i = 1; i <= keys.Length; i++)
{
    fp += keys[i - 1];
    if (i % 2 == 0)
        fp += " ";
}

// Reverse
var sb = new StringBuilder();
foreach(var pair in fp.Split(" ", StringSplitOptions.RemoveEmptyEntries))
{
    sb.Append(new []{pair[0], pair[1]});
    sb.Append(new []{pair[2], pair[3]});
}

var toEncode = sb.ToString();
var base64String = Convert.ToBase64String(Convert.FromHexString(toEncode));

Console.WriteLine(base64String == original);

UPD2 UPD2

Implementation which should be compatible with older .NET verions:应与旧 .NET 版本兼容的实现:

// Reverse
var split = fp.Split(new []{' '},  StringSplitOptions.RemoveEmptyEntries);
var bytes = new byte[split.Length * 2];
for (var index = 0; index < split.Length; index++)
{
    var pair = split[index];
    bytes[index * 2] = Convert.ToByte(pair.Substring(0, 2), 16);
    bytes[index * 2 + 1] = Convert.ToByte(pair.Substring(2, 2), 16);
}

var base64String = Convert.ToBase64String(bytes);
Console.WriteLine(base64String == original);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM