相关疑难解决方法(0)

C#接口.隐式实现与显式实现

在C#中隐式显式实现接口有什么区别?

什么时候应该使用隐式?什么时候应该使用显式?

是否有任何利弊和/或缺点?


Microsoft的官方指南(来自第一版框架设计指南)声明不建议使用显式实现,因为它会给代码带来意外行为.

我认为这个指南在IoC之前的时候是非常有效的,当你没有作为接口传递时.

任何人都可以触及这方面吗?

.net c# interface

615
推荐指数
10
解决办法
14万
查看次数

C#中的哈希和盐密码

我刚刚浏览了DavidHayden关于哈希用户密码的文章之一.

真的,我无法得到他想要实现的目标.

这是他的代码:

private static string CreateSalt(int size)
{
    //Generate a cryptographic random number.
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] buff = new byte[size];
    rng.GetBytes(buff);

    // Return a Base64 string representation of the random number.
    return Convert.ToBase64String(buff);
}

private static string CreatePasswordHash(string pwd, string salt)
{
    string saltAndPwd = String.Concat(pwd, salt);
    string hashedPwd =
        FormsAuthentication.HashPasswordForStoringInConfigFile(
        saltAndPwd, "sha1");
    return hashedPwd;
}
Run Code Online (Sandbox Code Playgroud)

有没有其他C#方法来散列密码并添加盐?

c# passwords hash salt

174
推荐指数
9
解决办法
20万
查看次数

我可以比较两个相等大小的位图以确定它们是否相同的最快方法是什么?

我正在尝试编写一个函数来确定两个相等大小的位图是否相同.我现在的功能只是在每个位图中一次比较一个像素,在第一个不相等的像素处返回false.

虽然这可行,并且适用于小位图,但在生产中我将在紧密循环和更大的图像中使用它,所以我需要一种更好的方法.有没有人有任何建议?

我使用的语言就是C# - 是的,我已经在使用.LockBits方法了.=)

编辑:我编写了一些给出的建议的实现,这里是基准测试.设置:两个相同(最坏情况)的位图,大小为100x100,每个迭代次数为10,000次.结果如下:

CompareByInts (Marc Gravell) :   1107ms
CompareByMD5  (Skilldrick)   :   4222ms
CompareByMask (GrayWizardX)  :    949ms
Run Code Online (Sandbox Code Playgroud)

在CompareByInts和CompareByMask中,我使用指针直接访问内存; 在MD5方法中,我使用Marshal.Copy来检索字节数组并将其作为参数传递给MD5.ComputeHash.CompareByMask只是稍快一点​​,但考虑到上下文,我认为任何改进都是有用的.

感谢大家.=)

编辑2:忘了打开优化 - 这样做可以让GrayWizardX的答案更加强大:

CompareByInts   (Marc Gravell) :    944ms
CompareByMD5    (Skilldrick)   :   4275ms
CompareByMask   (GrayWizardX)  :    630ms
CompareByMemCmp (Erik)         :    105ms
Run Code Online (Sandbox Code Playgroud)

有趣的是,MD5方法根本没有改进.

编辑3:发布了我的答案(MemCmp),它将其他方法从水中吹走.OO

c# comparison bitmap

38
推荐指数
4
解决办法
3万
查看次数

如何比较两个字节数组

我有两个字节数组,内容完全相同.我试过了:

if (bytearray1 == bytearray2) {...} else {...}
Run Code Online (Sandbox Code Playgroud)

if (Array.Equals(bytearray1, bytearray2)) {....} else {...}
Run Code Online (Sandbox Code Playgroud)

一直到别的地方!我不知道为什么!我手动检查了两个阵列!

c# bytearray

25
推荐指数
3
解决办法
4万
查看次数

检查两个字节数组的相等性

我正在检查两个字节数组的相等性,我想要一些帮助,因为即使数组应该相等,我也会返回false.

在我的调试中,我可以看到a1和b1都相等,但是它不会进入while循环来增加i.

public bool Equality(byte[] a1, byte[] b1)
{
    int i;
    bool bEqual;
    if (a1.Length == b1.Length)
    {
        i = 0;
        while ((i < a1.Length) && (a1[i]==b1[i]))
        {
            i++;
        }

        if (i == a1.Length)
        {
            bEqual = true;
        }
    }
    return bEqual;
}
Run Code Online (Sandbox Code Playgroud)

这总是返回false : (a1[i]==b1[i]).

c#

25
推荐指数
3
解决办法
4万
查看次数

通过PInvoke传递托管byte []数组以由Win32填充时,是否需要固定?

假设您正在调用将填充字节数组的Win32函数.您创建一个大小为32的数组,为空.然后将其传递给Win32函数以填充int,稍后在托管代码中使用它.字节数组是否有可能在分配时被移动或覆盖,并且由Win32函数填充?

.net c# clr pinvoke visual-studio

24
推荐指数
1
解决办法
1万
查看次数

如何使用字节数组比较两个图像

我希望能够从Byte []转换为Image,反之亦然.

我从这里开始这两种方法:

public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
    MemoryStream ms = new MemoryStream();
    imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
    return  ms.ToArray();
}

public Image byteArrayToImage(byte[] byteArrayIn)
{
     MemoryStream ms = new MemoryStream(byteArrayIn);
     Image returnImage = Image.FromStream(ms);
     return returnImage;
}
Run Code Online (Sandbox Code Playgroud)

他们似乎工作,但如果我这样做:

byte[] pic = GetImageFromDb();
bool result = pic == imageToByteArray(byteArrayToImage(pic));
Run Code Online (Sandbox Code Playgroud)

我明白了result = false!

有没有办法纠正这种方法或一些不同的功能来实现我的目标?

谢谢!

c# image bytearray

17
推荐指数
1
解决办法
4万
查看次数

C#字节数组比较

我使用.NET 3.0在C#中有两个字节数组.

比较两个字节数组是否包含每个元素的相同内容的"最有效"方法是什么?

例如,字节数组{0x1, 0x2}{0x1, 0x2}.但字节数组{0x1, 0x2}和字节数组{0x2, 0x1}不一样.

.net c# bytearray

14
推荐指数
3
解决办法
2万
查看次数

如何在VC++ 10.0中链接msvcrt.dll而不是msvcr100.dll?

是否可以在VC++ 10.0中链接VC6的MSVCRT.DLL?

默认情况下,它似乎与MSVCR100.DLL进行连接,但我不想再分发另一个DLL(MSVCRT.DLL已经可以在每一个,我支持OS).

== ==编辑

澄清一下:我的应用程序是一个纯C应用程序,它可以调用WinAPI.我确实理解做C++将需要C++运行时,默认情况下它不捆绑在Windows中(并且最有可能必须匹配编译器).我的问题是关于纯C的使用,以及我目标的最早版本的Windows中存在的CRT功能.

visual-c++

12
推荐指数
3
解决办法
1万
查看次数

在C#中对字符串进行异或

我最近开始玩C#,我试图理解为什么下面的代码不能编译.在错误评论的行上,我得到:

无法将类型'int'隐式转换为'char'.显式转换退出(您是否错过了演员?)

我正在尝试使用两个字符串进行简单的XOR操作.

public string calcXor (string a, string b)
{
    char[] charAArray = a.ToCharArray();
    char[] charBArray = b.ToCharArray();
    char[] result = new char[6];
    int len = 0;

    // Set length to be the length of the shorter string
    if (a.Length > b.Length)
        len = b.Length - 1;
    else
        len = a.Length - 1;

    for (int i = 0; i < len; i++) {
        result[i] = charAArray[i] ^ charBArray[i]; // Error here
    }

    return new string (result);
}
Run Code Online (Sandbox Code Playgroud)

c# xor

8
推荐指数
2
解决办法
2万
查看次数