我写了一个小代码片段来演示这个问题.问题是当我声明一个具有Layout.Explicit状态的结构时,它会根据另一个值为该结构的字段分配一个未定义的值.仅在使用Layout.Explicit状态时才会出现此问题.没有代码很难解释,所以这里是一个简短的样本.
using System.Runtime.InteropServices;
namespace ConsoleStruct
{
class Program
{
[StructLayout(LayoutKind.Explicit)]
struct TestStruct
{
[FieldOffset(0)]
public double dbl;
[FieldOffset(0)]
public ulong uu;
}
public static void SimpleMethod()
{
TestStruct st;
st.uu = 0;
st.dbl = 5000.0;
Console.WriteLine(st.uu.ToString()); // ==> uu becomes 4662219572839972864
//instead of 0 :(
// it looks like the value of uu is dependent on the
//value assigned to dbl
Console.ReadLine();
}
static void Main(string[] args)
{
SimpleMethod();
}
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释为什么会这样.使用VS 2013.谢谢.
我试图使用system.filesize函数来获取delphi中的文件大小,它适用于文件<4GB但文件> 4GB失败.所以我实现了我自己的,打开所需的文件作为文件流,并获得完美的streamize.
这是一个片段
function GiveMeSize(PathtoFile : string): int64;
var
stream : TFileStream;
size : int64;
begin
try
stream := TFileStream.Create(PathtoFile, fmOpenReadWrite or fmShareDenyNone);
size := stream.size;
except
showmessage('Unable to get FileSize');
end
finally
stream.free;
end;
Run Code Online (Sandbox Code Playgroud)
但我上面的函数的问题是它打开文件,在处理大量文件时会产生一些开销.是否有任何功能可以获得文件大小> 4GB的文件而无需先打开文件?我已经尝试了一些在线功能,但他们倾向于报告大于4GB的文件的错误文件大小.
德尔福版:XE5
谢谢.
我试图使用带有AES 256的SynCrypto.pas加密文件,但如果我尝试加密大小不是16字节倍数的文件,它就会失败.解密的数据包含垃圾.
例:
txt文件中的原始字符串
我们正在测试该文件
加密字符串
[ù["|wáî} f*!4ìÙw-•ü¨s
解密字符串
我们正在测试t?p?J
这是我的加密代码
procedure TForm1.Button1Click(Sender: TObject);
var
A: TAES;
Key: TSHA256Digest;
s, B: TAESBlock;
ks: integer;
st: RawByteString;
InStream, OutStream: TFileStream;
SuperNo, TheSize, StreamSize: Int64;
begin
InStream := TFileStream.Create('test.txt', fmOpenRead);
OutStream := TFileStream.Create('out.txt', fmCreate);
InStream.Position := 0;
OutStream.Position := 0;
st := '1234essai';
ks := 256;
SHA256Weak(st, Key);
A.EncryptInit(Key, ks);
StreamSize := InStream.Size;
while InStream.Position < StreamSize do
begin
TheSize := StreamSize - InStream.Position;
if TheSize < 16 then
begin …Run Code Online (Sandbox Code Playgroud) 我有一段代表这样的C#代码
digitsResPtr[-1] = digitsPtr[0] << rightShiftRev;
Run Code Online (Sandbox Code Playgroud)
where digitsResPtr和digitsPtr是一个指向UInt32数组的指针,rightShiftRev是一个整数.
我想知道这个Delphi表示是否正确?
(digitsResPtr - 1)^ := digitsPtr[0] shl rightShiftRev;
Run Code Online (Sandbox Code Playgroud)
我的主要问题是负面索引.
谢谢.
德尔福XE7 UP 1.
我需要检测 USB 设备何时从我的程序中移除或插入。我做了一些研究并发现了这一点,但不知道如何实现/使用它。有人可以帮我提供一个函数,该函数在 USB 插入时返回 true,在移除时返回 false,以便我可以调用计时器每秒检查该函数吗?
使用德尔福XE7。
谢谢。