小编tig*_*rou的帖子

你如何直接从物理内存中读取?

在C或C++(windows)中,如何通过提供物理(非虚拟)地址来读取RAM?这意味着无需通过虚拟内存系统(mmu表),并且特定于一个进程.

我已经知道API ReadProcessMemory,它从ram中读取(由大多数培训师使用),但它仅适用于特定的过程.

我在MSDN上搜索并发现Device\PhysicalMemory似乎提供了这种可能性,但我发现没有实际的例子,这个功能似乎已被Windows服务包关闭(以修复某些漏洞).

我知道这是可能的,因为WinHex会这样做(如果你选择"工具">"打开ram">"物理内存").然后它将显示RAM内容从0x00000000到your_ram_size,就像打开传统文件一样.它需要管理员权限,但没有安装驱动程序(这意味着WinHex从用户模式执行).

编辑:添加有关操作系统的信息.

c c++ memory windows readprocessmemory

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

如果已经有未提交的更改,如何使用hg命令行应用多个补丁?

我使用以下命令来应用补丁Mercurial,而不提交它:

hg import patch.diff --no-commit
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但是如果我尝试一次应用几个补丁:

hg import patch1.diff --no-commit
hg import patch2.diff --no-commit
...
Run Code Online (Sandbox Code Playgroud)

我在第二次提交后收到此错误消息:

abort: uncommitted changes
Run Code Online (Sandbox Code Playgroud)

如果我完全相同SourceTree(应用patch1然后patch2并选择"修改工作副本文件")它可以工作:两个补丁应用于工作副本,patch1和patch2的变化组合/折叠在一起.

如何使用hg命令行执行相同的操作?

versioning mercurial command-line patch

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

为什么以下在委托中使用协方差的示例无法编译?

我已经定义了以下委托类型.一个返回一个字符串,一个返回一个对象:

delegate object delobject();
delegate string delstring();
Run Code Online (Sandbox Code Playgroud)

现在考虑以下代码:

delstring a = () => "foo";
delobject b = a; //Does not compile!
Run Code Online (Sandbox Code Playgroud)

为什么作业无效?

我不明白.返回字符串的方法应该被安全地视为返回对象的方法(因为字符串是对象).


在C#4.0中,以下示例有效.我使用Func<TResult>泛型类型而不是使用委托:

Func<string> a = () => "foo";
Func<object> b = a; //Perfectly legal, thanks to covariance in generics
Run Code Online (Sandbox Code Playgroud)

另外:如果我以这种方式重写它,它的工作原理:

delobject b = () => a();
Run Code Online (Sandbox Code Playgroud)

但这与我最初想要的不一样.现在我创建了一个调用另一个方法的新方法.

它不仅仅是一个赋值,如下例所示:

delint a = () => 5;
delobject b = a; //Does not work, but this is OK, since "int" is a value type.
delobject b = () => …
Run Code Online (Sandbox Code Playgroud)

c# generics delegates covariance

11
推荐指数
2
解决办法
422
查看次数

为什么IsAssignableFrom在将nullable与接口进行比较时返回false?

C#中的以下调用返回false:

typeof(IComparable).IsAssignableFrom(typeof(DateTime?))
Run Code Online (Sandbox Code Playgroud)

但是,以下行完全有效:

IComparable comparable = (DateTime?)DateTime.Now;
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

是因为使用了可空类型Nullable<T>,第一个泛型参数实现接口的事实并不意味着Nullable类也实现了该接口?(例如:List<Foo>不实现实现的接口Foo)

编辑:我认为上面的行编译,因为当装箱一个可空类型时,只有底层类型被装箱,如下所述:https://msdn.microsoft.com/en-us/library/ms228597.aspx

c# types

11
推荐指数
1
解决办法
895
查看次数

在C#中,为什么数组上的Equals()方法只比较它们的引用,而不是它们的实际内容

C#,为什么Equals()方法总是arrays通过比较引用而不是通过比较内容来检查两者之间的相等?

因此,调用Equals()其实现的所有方法(很多)都不能像数组那样工作(它不会比较内容):

示例:

int[] array1 = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] array2 = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9};

var u = array1.Equals(array1);                                       //true
var v = array1.Equals(array2);                                       //false
var w = Array.Equals(array1, array2);                                //false
var x = (new List<int[]>(new int[][] { array1 })).Contains(array2);  //false
var y = (new int[][] { array1 }).Any(x => x == array2);              //false
var z = (new …
Run Code Online (Sandbox Code Playgroud)

c# arrays equality reference

9
推荐指数
1
解决办法
7084
查看次数

字符串在x64中占用多少字节?

出于学习的目的,我试图理解C#字符串是如何内部存储在内存中的.

根据这篇博客文章,C#字符串大小是(x64与.NET framework 4.0):

26 + 2 * length
Run Code Online (Sandbox Code Playgroud)

带有单个字符的字符串(26 + 2 * 1) / 8 * 8 = 32 bytes.这确实与我测量的相似.

让我感到困惑的是26字节的开销.

我运行了以下代码并检查了内存:

string abc = "abcdeg";
string aaa = "x";
string ccc = "zzzzz";
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

AFAIK这些块如下:

  • 绿色:同步块(8个字节)
  • 青色:类型信息(8字节)
  • 黄色:长度(4个字节)
  • 粉红色:实际字符:每个字符2个字节+ 2个字节,用于NULL终止符.

看看"x"字符串.它确实是32个字节(按计算).

无论如何,如果用零填充,它看起来像字符串的结尾."x"字符串可能在NULL终止符的两个字节之后结束,并且仍然是内存对齐的(因此是24字节).为什么我们需要额外的8个字节?

我已经尝试了与其他(更大)字符串大小相似的结果.它看起来总是有8个字节.

c# memory string clr

8
推荐指数
1
解决办法
238
查看次数

使用GDI +绘制文本时是否可以定义精确的字体大小?

我正在使用以下代码在位图上绘制文本:

using (Font font = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Point))
{
    //draw the text
    graphics.DrawString("Some text", font, Brushes.White, rect, stringFormat);
}
Run Code Online (Sandbox Code Playgroud)

它很好用.这是渲染文字:

在此输入图像描述

我想让文字更大一些.如果我将11设置为字体大小,这是我得到的:

在此输入图像描述

它太大了我想要的东西.我尝试了10.25,10.5等,但它给出的结果与10相同.

我也尝试设置GraphicsUnitPixel,但它的行为是相同的(没有可能设置自定义字体大小).

这是我的问题:

使用GDI +(C#)绘制文本时,是否有可能"微调"渲染文本的大小?


编辑:更完整的代码片段(根据要求):

using (Bitmap bitmap = new Bitmap(width, height))
using (Graphics graphics = Graphics.FromImage(bitmap))     
using (Font font = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Point))
{
   graphics.SmoothingMode = SmoothingMode.AntiAlias;
   graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

   Rectangle rect = new Rectangle(0, 0, width, height);

   //method 1
   StringFormat stringFormat = new StringFormat();
   stringFormat.Alignment = StringAlignment.Center;
   stringFormat.LineAlignment …
Run Code Online (Sandbox Code Playgroud)

c# windows gdi+

7
推荐指数
1
解决办法
3580
查看次数

如何将平面上的3D点转换为UV坐标?

我有一个3d点,定义为[x0, y0, z0].

这一点属于一个平面,由[a, b, c, d].

normal= [a, b, c],和ax + by + cz + d = 0

如何将3d点转换或映射到一对(u,v)坐标?

这一定非常简单,但我无法理解.

c# math 3d texture-mapping plane

7
推荐指数
2
解决办法
6088
查看次数

从映射到排列的数字,如何生成与先前的perm不同的其他排列.通过交换元素?

使用Lehmer代码,可以使用因子数系统对N个元素序列的任何排列进行编码并映射到十进制数.

示例:

Lehmer代码ABCD排列:

ABDC => 0010
CBAD => 2100
DCBA => 3210
Run Code Online (Sandbox Code Playgroud)

这些inversions vectors可以使用阶乘法转换为小数:

2100 => 2 x 3! + 1 x 2! + 0 x 1! + 0 x 0!
     => 2 x 6  + 1 x 2  + 0 x 1  + 0 x 1
     => 14
Run Code Online (Sandbox Code Playgroud)

因此CBAD排列可以直接映射到数字14.

我的问题是:

从映射到置换的数字,是否有一种计算有效的方法通过交换序列中的两个元素来生成与先前的置换不同的其他排列的数量?


示例:我们有4个(映射到ADBC),我们想要交换前两个元素.结果是18(或DABC).

4    => 18
0200 => 3000
ADBC => DABC …
Run Code Online (Sandbox Code Playgroud)

c# algorithm math permutation factorial

7
推荐指数
1
解决办法
457
查看次数

有没有办法在视图状态中存储匿名委托?

在a中WebControl,我有一个如下Filters定义的属性:

public Dictionary<string, Func<T, bool>> Filters
{
    get
    {
       Dictionary<string, Func<T, bool>> filters =
               (Dictionary<string, Func<T, bool>>)ViewState["filters"];
       if (filters == null)
       {
          filters = new Dictionary<string, Func<T, bool>>();
          ViewState["filters"] = filters;
       }
       return filters;
    }
 }
Run Code Online (Sandbox Code Playgroud)

这个webcontrol是一个DataSource,我创建了这个属性,因为我希望有可能轻松过滤数据,例如:

//in page load    
DataSource.Filters.Add("userid", u => u.UserID == 8);
Run Code Online (Sandbox Code Playgroud)

但是,如果我将代码更改为:

//in page load    
int userId = int.Parse(DdlUsers.SelectedValue);
DataSource.Filters.Add("userid", u => u.UserID == userId);
Run Code Online (Sandbox Code Playgroud)

它不再起作用,我收到此错误:

程序集"..."中的System.Web.UI.Page类型未标记为可序列化.

发生了什么 :

  1. 序列化程序检查字典.它看到它包含一个匿名委托(这里是lambda)
  2. 由于委托是在类中定义的,因此它会尝试序列化整个类,在本例中为System.Web.UI.Page
  3. 此类未标记为Serializable
  4. 它因3而引发异常.

有没有方便的解决方案来解决这个问题?由于显而易见的原因,我无法将所有使用数据源的网页标记为[可序列化].


编辑1:我不明白的东西.如果我存储Dictionary在 …

c# viewstate serialization delegates webforms

6
推荐指数
1
解决办法
922
查看次数