命令行参数和“字节”数组

时间:2019-08-05 03:52:43

标签: c#

所以我有一个生成的字节数组,形式为'\ xef \ x00 \ xef \ x00'等等等等。该程序应该将此作为参数,对其进行加密并显示结果。问题是从命令行它是'\ xef \ x00 \ xef \ x00',所以它不起作用。

我尝试了各种编码(UTF8,Unicode,默认等)。我尝试了不同的“输入”方法,但是由于字节数组的来源首先是不理想的。不同的输入方法类似于字节的0x00格式。

我已经搜寻了几个小时,但一无所获。涉及字节数组的大多数事情是“如何将其传递给方法”> _ <;

*http.Response

最后... oneb和twob的大小应相同,包含相同的内容。

3 个答案:

答案 0 :(得分:2)

当传入参数时,字符串将被转义,这就是为什么您不将其作为文字字符串的原因。

您可以使用Regex.Unescape将转义的字符串转换为未转义的字符串,然后根据需要转换为数组。

static void Main(string[] args)
{
    {
        string str = System.Text.RegularExpressions.Regex.Unescape(args[0]);

        var bytes = str.Select(c => (byte)c).ToArray();

        Console.WriteLine(str);
        Console.WriteLine(BitConverter.ToString(bytes));

        Console.ReadKey();
    }
}

结果:-

C:\Temp>ConsoleApp.exe \xfc\xe8\x82\x00\x00
üè?
FC-E8-82-00-00

答案 1 :(得分:0)

我确实找到了一个临时解决方法,但这并不是我认为的“最佳”解决方案。一切都会更好的方法。

        public static byte[] StringToBytes2(string str)
        {
            string[] parts = str.Split(new string[] { "\\" }, StringSplitOptions.RemoveEmptyEntries);
            byte[] bytes = new byte[parts.Length];

            for (int i = 0; i < parts.Length; i++)
            {
                if (parts[i] != "")
                {
                    string temp = String.Format("0{0}", parts[i]);
                    bytes[i] = Convert.ToByte(temp, 16);
                }
            }
            return bytes;
        }

答案 2 :(得分:0)

首先,可能没有方便的编码方案可以为您提供所需的原始字节。您可以通过使用LINQ将字符串中的每个字符转换为字节来获取正确的值:

string one = "\xfc\xe8\x82\x00\x00";
string oneBytes = one.Select(c => (byte)c).ToArray();

之所以起作用,是因为程序中的字符串常量在编译过程中会转换为5个字符长的字符串,并以十六进制值作为代码点。

现在让我们假设您运行程序并提供相同的带引号的字符串作为参数:

YourProgram.exe "\xfc\xe8\x82\x00\x00"

现在,如果您在程序中检查arg[0],则会发现它是20个字符而不是5个字符,在检查器中看起来像这样:

"\\xfc\\xe8\\x82\\x00\\x00"

这是因为参数是传入的文字文本(不包括引号),并且不解释转义字符。

Aleks在这件事上击败了我,但他的解决方案是正确的。 Regex类具有一个方法,该方法接受转义的字符串并解释转义,这将为您提供您要查找的5个字符的字符串:

var two = System.Text.RegularExpressions.Regex.Unescape(args[0]);
var twoBytes = two.Select(c => (byte)c).ToArray();

现在,两个数组中的字节数相同。


顺便说一句,不要尝试将任意字节用作字符串值,并假定它们将以任何特定的编码正确再现。在.Net中,字符串以Unicode格式存储,到目前为止,我还没有发现任何编码不会导致转换期间前256个代码点(\u0000-\u00FF)发生变化。这就是为什么从charbyte的直接转换是您最直接的选择。

其次,我希望您仅出于参数目的。将字符串用作字节存储非常浪费。