小编Xor*_*-el的帖子

奇怪的结构行为

我写了一个小代码片段来演示这个问题.问题是当我声明一个具有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.谢谢.

c# struct

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

FileSize函数的问题

我试图使用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

谢谢.

delphi

2
推荐指数
1
解决办法
2306
查看次数

使用SynCrypto进行AES加密的问题

我试图使用带有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)

delphi encryption cryptography aes

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

负数组索引

我有一段代表这样的C#代码

digitsResPtr[-1] = digitsPtr[0] << rightShiftRev;
Run Code Online (Sandbox Code Playgroud)

where digitsResPtrdigitsPtr是一个指向UInt32数组的指针,rightShiftRev是一个整数.

我想知道这个Delphi表示是否正确?

(digitsResPtr - 1)^ := digitsPtr[0] shl rightShiftRev;
Run Code Online (Sandbox Code Playgroud)

我的主要问题是负面索引.

谢谢.

德尔福XE7 UP 1.

c# arrays delphi

0
推荐指数
1
解决办法
970
查看次数

Delphi 中的自动检测 USB 插入和移除

我需要检测 USB 设备何时从我的程序中移除或插入。我做了一些研究并发现了这一点,但不知道如何实现/使用它。有人可以帮我提供一个函数,该函数在 USB 插入时返回 true,在移除时返回 false,以便我可以调用计时器每秒检查该函数吗?
使用德尔福XE7。

谢谢。

delphi

-2
推荐指数
1
解决办法
1180
查看次数

标签 统计

delphi ×4

c# ×2

aes ×1

arrays ×1

cryptography ×1

encryption ×1

struct ×1