在C或C++(windows)中,如何通过提供物理(非虚拟)地址来读取RAM?这意味着无需通过虚拟内存系统(mmu表),并且特定于一个进程.
我已经知道API ReadProcessMemory
,它从ram中读取(由大多数培训师使用),但它仅适用于特定的过程.
我在MSDN上搜索并发现Device\PhysicalMemory似乎提供了这种可能性,但我发现没有实际的例子,这个功能似乎已被Windows服务包关闭(以修复某些漏洞).
我知道这是可能的,因为WinHex会这样做(如果你选择"工具">"打开ram">"物理内存").然后它将显示RAM内容从0x00000000到your_ram_size,就像打开传统文件一样.它需要管理员权限,但没有安装驱动程序(这意味着WinHex从用户模式执行).
编辑:添加有关操作系统的信息.
我使用以下命令来应用补丁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命令行执行相同的操作?
我已经定义了以下委托类型.一个返回一个字符串,一个返回一个对象:
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#中的以下调用返回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#
,为什么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#字符串是如何内部存储在内存中的.
根据这篇博客文章,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这些块如下:
看看"x"字符串.它确实是32个字节(按计算).
无论如何,如果用零填充,它看起来像字符串的结尾."x"字符串可能在NULL终止符的两个字节之后结束,并且仍然是内存对齐的(因此是24字节).为什么我们需要额外的8个字节?
我已经尝试了与其他(更大)字符串大小相似的结果.它看起来总是有8个字节.
我正在使用以下代码在位图上绘制文本:
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相同.
我也尝试设置GraphicsUnit
到Pixel
,但它的行为是相同的(没有可能设置自定义字体大小).
这是我的问题:
使用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) 我有一个3d点,定义为[x0, y0, z0]
.
这一点属于一个平面,由[a, b, c, d]
.
normal
= [a, b, c]
,和ax + by + cz + d = 0
如何将3d点转换或映射到一对(u,v)
坐标?
这一定非常简单,但我无法理解.
使用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) 在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:我不明白的东西.如果我存储Dictionary
在 …