【问题标题】:Initializing an Array when the length is deciphered in a following IF block在后续 IF 块中破译长度时初始化 Array
【发布时间】:2016-07-28 16:09:34
【问题描述】:

我目前有一个方法,我正在尝试用字节数组做一些事情。然而,这个字节数组的长度取决于方法的参数。我需要在 if-else 块之前而不是在其中声明数组,否则变量超出范围。

该方法的一个例子如下:

private static byte[] messageFormatting(string bodyText, byte packetType)
{
    int index = 0;
    byte[] messageBody;

    if(packetType == 0x03)
    {
        byte[] RSAEncryptedMessageBody = RSAEncrypt(bodyText);
        messageBody = new byte[(RSAEncryptedMessageBody.Length)];
        Array.Copy(RSAEncryptedMessageBody, messageBody, RSAEncryptedMessageBody.Length);
    }

    else
    {
        messageBody = System.Text.Encoding.ASCII.GetBytes(bodyText);
    }

    byte[] fullMessage = new byte[(messageBody.Length + 6)];

    //do others things

}

执行该方法时出现异常错误,因为我不能有未设置为对象实例的对象引用。

当我在前面的byte[] messageBody 中有一个空白初始化时,我认为这意味着我不能做messageBody = new byte[]。但是如果我删除这个声明,if-else 块下面的引用就超出了范围。在加密发生之前,我不知道messageBody 的长度。有什么建议吗?

【问题讨论】:

  • 你的代码片段对我来说编译得很好。可能需要仔细检查该错误的来源。 (在我添加了一个返回之后)。
  • 加入一些断言。例如。 RSAEncrypt 返回 null 吗?还有你为什么要复制数组?
  • @Wjdavis5 它编译得很好,但是任何运行它的尝试都会抛出“对象引用未设置为对象的实例”异常。 RSAEncrypt 返回一个字节数组
  • 好的,但是在您的问题中,您明确指出它无法编译。
  • @Wjdavis5 啊,我做到了,抱歉。我会更新我的问题

标签: c# arrays encryption scope


【解决方案1】:

我的猜测是你的错误在这里出现:

byte[] RSAEncryptedMessageBody = RSAEncrypt(bodyText);
messageBody = new byte[(RSAEncryptedMessageBody.Length)];

RSAEncrypredMessageBody 可能为空。你的 RSAEncrypt 函数在做什么?

【讨论】:

  • 在进一步调查错误后,它确实返回了 null。我得到一个 RSAEncryption“错误长度”。异常,它在 try catch 中返回 null。谢谢
  • 这就是为什么你不在库函数中捕获异常并让这些函数的调用者对它们做任何事情的原因
猜你喜欢
  • 2014-03-31
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 2015-10-05
相关资源
最近更新 更多