我怎样才能用C#和.NET 3.5 / 4优雅地做到这一点? 例如,一个数字可以在1到100之间。 我知道一个简单的就足够了; 但这个问题的关键字是高雅。 这是我的玩具项目不是为了生产。 这个问题不是速度,而是代码美。 停止谈论效率等等。 记得你正在向合唱团传道。
可以通过执行以下操作来检索string的第一个char吗? MyString.ToCharArray[0]
我在研究C#,我想知道重写ToString的重点和好处是什么,如下面的例子所示。 这可以用一个简单的方法来完成,使用一个没有覆盖的常用方法? public string GetToStringItemsHeadings { get { return string.Format("{0,-20} {1, -20}", "Office Email", "Private Email"); } } public override string ToString() { string strOut = string.Format("{0,-20} {1, -20}", m_work, m_personal); return strOut; }
下面的代码编译没有问题: int main() { printf("Hi" "Bye"); } 但是,这不会编译: int main() { int test = 0; printf("Hi" (test ? "Bye" : "Goodbye")); } 这是什么原因?
按以下方式构build发布请求的string, var itemsToAdd = sl.SelProds.ToList(); if (sl.SelProds.Count() != 0) { foreach (var item in itemsToAdd) { paramstr = paramstr + string.Format("productID={0}&", item.prodID.ToString()); } } 在得到paramstr ,我需要删除最后一个字符 如何使用C#删除string中的最后一个字符?
在我继续之前,请注意,这是一个相当长的关于Windows命令提示符的infosec通知,因为我发现了一个可能被使用简单的batch file利用的bug。 这个bug在2000以后的所有Windows版本中都很普遍,在64位和32位机器上都能正常运行,而且这是一个batch fileparsing错误,它不需要额外的软件来安装( cmd.exe是Windows的缺省部分)并且可以由任何具有任何级别的特权的用户启动(假设他们可以运行cmd.exe并因此parsingbatch file)。 在这个总结中包含了错误发生的地方(用代码stream来分析原因)。 这不是一个RCE级的bug(不是我已经能够find的),只是一个DoStypes,并且需要用户运行它(或者把它作为启动项),但是考虑到它的简单性和Windows系统无处不在,我觉得值得再看一下。 请注意,如果您运行任何这些启用batch file的bug并导致系统崩溃(任务pipe理器并在运行失控脚本的情况下终止PID),则我不承担任何责任。 tldr :只有这行^ nul<^的batch file会导致大量的内存泄漏,而只有这一行的batch file会导致命令提示符因“无限recursion”而崩溃。 这些行为可能导致在任何Windows系统(Win2k +)上发生有趣的批量“黑客攻击”,原因是cmd.exebatch file处理中存在逻辑错误(请参阅下面的汇编和伪C代码以获取更多信息)。 背景 在回答关于超级用户( 链接 )的问题时,我遇到了一个有趣的exception情况:命令解释器如何parsingbatch file。 如果脱字符( ^ )是该文件的最后一个字符,则可能会发生内存泄漏/ cmd.exe崩溃。 脱字符必须是文件的最后一个字符,不能跟着\n (换行字符),尽pipe\r (回车符)是正确的,因为在脱字符被parsing之前它已被删除; 没有任何东西可以跟踪它,因为它会导致parsing器正常进行(因为^\r\t会变成“ ^\t因此\t被“忽略”)。 关于回车字符的最后一个注意事项,这个错误仍然发生,这实际上使它更有趣一些,因为它在大多数文本编辑器中“伪造”了一个换行符,而在记事本中,你可能会被愚弄到认为最后有一个换行符'技术上'这是一个回车或'旧的Mac'新线)。 在做了一些快速的调查之后,我发现文件末尾的^可能会导致内存泄漏或者可能导致命令提示符崩溃(更具体地说是command.com或cmd.exe程序),我还发现特定的batch file及其序列)可以导致一些非常有趣的行为。 进一步的调查使我向其他人提出类似的问题。 一个Stack Overflow问题,用户在ss64.com上发现了一个内存泄漏和一个留言板话题,这个话题logging了EOF插入符其他有趣的行为 。 堆栈溢出问题有助于确认暂停,这是一个无限循环types的情况,但没有试图潜水比这更深。 ss64.org主题大多讨论了各种使命令提示符崩溃的方法,但未能解释它是什么样的崩溃或原因。 这当然会让我质疑发生了什么,为什么(可以被利用)。 答案是混合的,修复很简单(至less从我正在检查的程序集看起来是“简单的”)。 我发现可以产生内存泄漏的batch file技巧的几种组合,多快或多慢取决于batch file中的内容(而不是多less插入符号,但pipe道顺序和有趣的行长度[稍后])并且无论崩溃或内存泄漏,parsing器代码在单个线程中处于紧密的循环中,因此CPU使用率显着增加(单核CPU或推送到单个关联,平均产生98%以上的CPU使用率)。 崩溃 要使命令提示符崩溃非常简单,没有换行符的batch file只包含以下字符^&^ (或^|^ ),将导致批处理命令提示符崩溃,错误代码为0xC00000FD ,这是由于无限recursion导致的堆栈/帧溢出。 这证实了'无限循环'的情况,但没有完全解释内存泄漏(或为什么因为无限的recursion而崩溃)。 在这个意义上,我开始研究一些最简单的产生内存泄漏的方法。 事实certificate,一个2字节的batch […]
我似乎看到很多答案,其中有人build议使用<random>来产生随机数,通常伴随着这样的代码: std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(0, 5); dis(gen); 通常这会取代某种“不圣洁的憎恶”,比如: srand(time(NULL)); rand()%6; 我们可以通过争论time(NULL)提供低熵, time(NULL)是可预测的,最终结果是不一致的来批评旧的方法。 但所有这一切都是新的方式:它只是有一个更光泽的单板。 rd()返回一个unsigned int 。 这至less有16位,可能是32.这不足以种子MT的19937位的状态。 使用std::mt19937 gen(rd());gen() (用32位播种并查看第一个输出)不能提供良好的输出分布。 7和13永远不会是第一个输出。 两颗种子产生0.12颗种子产生1226181350.( 链接 ) std::random_device可以是,有时是作为一个简单的PRNG与一个固定的种子实现。 因此,它可能会在每次运行中产生相同的序列。 ( 链接 )这比time(NULL)更差time(NULL) 。 更糟糕的是,复制和粘贴上述代码片段非常容易,尽pipe它们包含的问题。 有些解决scheme需要获取可能不适合每个人的大型 图书馆 。 鉴于此,我的问题是如何简洁,便携地将C ++中的PRNG彻底播种? 鉴于上述问题,一个很好的答案: 必须完全种下mt19937 / mt19937_64。 不能单纯依靠std::random_device或time(NULL)作为熵源。 不应该依靠Boost或其他库文库。 应适合less数几行,以便它看起来很好复制粘贴到一个答案。 思考 我目前的想法是std::random_device输出可以通过time(NULL) ,从地址空间随机化得到的值和一个硬编码的常量(可以在发布期间设置)来混合(也许通过XOR)在熵上尽力而为。 std::random_device::entropy() 并不能很好的说明std::random_device可能做什么或者不可以做什么。
昨天,我find了Christoph Nahr的一篇名为“.NET结构性能”的文章,该文章以几种语言(C ++,C#,Java,JavaScript)为基础,添加了两个点结构( double元组)。 事实certificate,C ++版本需要大约1000ms才能执行(1e9次迭代),而C#在同一台机器上不能低于〜3000ms(在x64中performance更差)。 为了自己testing,我使用了C#代码(稍微简化为只调用传入参数的方法),然后在i7-3610QM机器上运行(3.1Ghz单核加速),8GB RAM,Win8。 1,使用.NET 4.5.2,RELEASE构build32位(x86 WoW64,因为我的操作系统是64位)。 这是简化的版本: public static class CSharpTest { private const int ITERATIONS = 1000000000; [MethodImpl(MethodImplOptions.AggressiveInlining)] private static Point AddByVal(Point a, Point b) { return new Point(aX + bY, aY + bX); } public static void Main() { Point a = new Point(1, 1), b = new […]
我一直在阅读关于针对Windows XP和Windows Server 2003上的GDI +的老版本攻击,这些攻击称为我正在进行的项目的死亡JPEG。 这个漏洞在下面的链接中得到很好的解释: http : //www.infosecwriters.com/text_resources/pdf/JPEG.pdf 基本上,一个JPEG文件包含一个称为COM的部分,其中包含一个(可能是空的)注释字段和一个包含COM大小的两个字节的值。 如果没有注释,则大小为2.读取器(GDI +)读取大小,减去两个大小,然后分配适当大小的缓冲区以复制堆中的注释。 攻击涉及在该字段中设置值0 。 GDI +减2 ,导致值为-2 (0xFFFe) ,由memcpy转换为无符号整数0XFFFFFFFE 。 示例代码: unsigned int size; size = len – 2; char *comment = (char *)malloc(size + 1); memcpy(comment, src, size); 注意到第三行的malloc(0)应该返回一个指向堆中未分配内存的指针。 如何写0XFFFFFFFE字节( 4GB !!!!)可能不会崩溃程序? 这是否超出堆区,并进入其他程序和操作系统的空间? 那会发生什么? 正如我所了解的memcpy ,它只是从目的地复制n字符到源。 在这种情况下,源应该在栈上,堆上的目的地, n是4GB 。
我向新手教授了一种“精简”C ++编程课程(“lite”,意思是没有指针,没有类,只是简单的旧C,加上引用和STLstring和向量)。 学生以前没有编程经验,所以我相信使用交互式debugging器可以帮助他们理解程序stream,variables和recursion。 该课程在Linux中教授。 教他们使用gdb只是矫枉过正(他们不会使用也不了解大多数function)。 我只需要一些简单但易于使用的东西:查看程序现在在哪一行,栈中是什么(局部variables,以前的调用等等)。 我看起来类似于旧的Turbo Pascal或Turbo C ++ Borland的debugging器,或Visual Studiodebugging器。 谢谢,