- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试将以下 C++ 结构移植到 C#。
#pragma pack(push,1)
struct FatBootSectorStruct {
UCHAR BS_jmpBoot[3]; // 0
UCHAR BS_OEMName[8]; // 3
USHORT BPB_BytsPerSec; // 11
UCHAR BPB_SecPerClus; // 13
USHORT BPB_RsvdSecCnt; // 14
UCHAR BPB_NumFATs; // 16
USHORT BPB_RootEntCnt; // 17
USHORT BPB_TotSec16; // 19
UCHAR BPB_Media; // 21
USHORT BPB_FATSz16; // 22
USHORT BPB_SecPerTrk; // 24
USHORT BPB_NumHeads; // 26
ULONG BPB_HiddSec; // 28
ULONG BPB_TotSec32; // 32
union {
struct {
UCHAR BS_DrvNum; // 36
UCHAR BS_Reserved1; // 37
UCHAR BS_BootSig; // 38
ULONG BS_VolID; // 39
UCHAR BS_VolLab[11]; // 43
UCHAR BS_FilSysType[8]; // 54
UCHAR BS_Reserved2[448]; // 62
} Fat16;
struct {
ULONG BPB_FATSz32; // 36
USHORT BPB_ExtFlags; // 40
USHORT BPB_FSVer; // 42
ULONG BPB_RootClus; // 44
USHORT BPB_FSInfo; // 48
USHORT BPB_BkBootSec; // 50
UCHAR BPB_Reserved[12]; // 52
UCHAR BS_DrvNum; // 64
UCHAR BS_Reserved1; // 65
UCHAR BS_BootSig; // 66
ULONG BS_VolID; // 67
UCHAR BS_VolLab[11]; // 71
UCHAR BS_FilSysType[8]; // 82
UCHAR BPB_Reserved2[420]; // 90
} Fat32;
};
USHORT Signature; // 510
};
这是我的:
[StructLayout(LayoutKind.Explicit, Size = 512, Pack=1)]
internal struct FATBootSector
{
[FieldOffset(0)]
public byte[] BS_jmpBoot; // 0
[FieldOffset(3)]
public byte[] BS_OEMName; // 3
[FieldOffset(11)]
public ushort BPB_BytsPerSec; // 11
[FieldOffset(13)]
public byte BPB_SecPerClus; // 13
[FieldOffset(14)]
public ushort BPB_RsvdSecCnt; // 14
[FieldOffset(16)]
public byte BPB_NumFATs; // 16
[FieldOffset(17)]
public ushort BPB_RootEntCnt; // 17
[FieldOffset(19)]
public ushort BPB_TotSec16; // 19
[FieldOffset(21)]
public byte BPB_Media; // 21
[FieldOffset(22)]
public ushort BPB_FATSz16; // 22
[FieldOffset(24)]
public ushort BPB_SecPerTrk; // 24
[FieldOffset(26)]
public ushort BPB_NumHeads; // 26
[FieldOffset(28)]
public ulong BPB_HiddSec; // 28
[FieldOffset(32)]
public ulong BPB_TotSec32; // 32
// FAT16
[FieldOffset(36)]
public byte FAT16_BS_DrvNum; // 36
[FieldOffset(37)]
public byte FAT16_BS_Reserved1; // 37
[FieldOffset(38)]
public byte FAT16_BS_BootSig; // 38
[FieldOffset(39)]
public ulong FAT16_BS_VolID; // 39
[FieldOffset(43)]
public byte[] FAT16_BS_VolLab; // 43
[FieldOffset(54)]
public byte[] FAT16_BS_FilSysType; // 54
[FieldOffset(62)]
public byte[] FAT16_BS_Reserved2; // 62
// FAT32
[FieldOffset(36)]
public ulong FAT32_BPB_FATSz32; // 36
[FieldOffset(40)]
public ushort FAT32_BPB_ExtFlags; // 40
[FieldOffset(42)]
public ushort FAT32_BPB_FSVer; // 42
[FieldOffset(44)]
public ulong FAT32_BPB_RootClus; // 44
[FieldOffset(48)]
public ushort FAT32_BPB_FSInfo; // 48
[FieldOffset(50)]
public ushort FAT32_BPB_BkBootSec; // 50
[FieldOffset(52)]
public byte[] FAT32_BPB_Reserved; // 52
[FieldOffset(64)]
public byte FAT32_BS_DrvNum; // 64
[FieldOffset(65)]
public byte FAT32_BS_Reserved1; // 65
[FieldOffset(66)]
public byte FAT32_BS_BootSig; // 66
[FieldOffset(67)]
public byte FAT32_BS_VolID; // 67
[FieldOffset(71)]
public byte[] BS_VolLab; // 71
[FieldOffset(82)]
public byte[] FAT32_BS_FilSysType; // 82
[FieldOffset(90)]
public byte[] FAT32_BPB_Reserved2; // 90
[FieldOffset(510)]
public ushort Signature;
}
问题出在字段偏移量 0 和 3 上。当我尝试在 C# 中加载结构时,我得到 Could not load type 'FATBootSector' from assembly 'xxxx' because it contains an object field at offset 3 that that未正确对齐或被非对象字段重叠。
。我遇到了this previous question on SO但这似乎没有帮助。
我也尝试过将其更改为如下所示的顺序结构:
[StructLayout(LayoutKind.Sequential, Size = 512, Pack=1, CharSet=CharSet.Ansi)]
internal struct FATBootSector
{
[MarshalAs(UnmanagedType.U1)]
public byte BS_jmpBoot0; // 0
[MarshalAs(UnmanagedType.U1)]
public byte BS_jmpBoot1; // 0
[MarshalAs(UnmanagedType.U1)]
public byte BS_jmpBoot2; // 0
[MarshalAs(UnmanagedType.LPStr, SizeConst=8)]
public string BS_OEMName; // 3
[MarshalAs(UnmanagedType.U2)]
public ushort BPB_BytsPerSec; // 11
[MarshalAs(UnmanagedType.U1)]
public byte BPB_SecPerClus; // 13
[MarshalAs(UnmanagedType.U2)]
public ushort BPB_RsvdSecCnt; // 14
[MarshalAs(UnmanagedType.U1)]
public byte BPB_NumFATs; // 16
[MarshalAs(UnmanagedType.U2)]
public ushort BPB_RootEntCnt; // 17
[MarshalAs(UnmanagedType.U2)]
public ushort BPB_TotSec16; // 19
[MarshalAs(UnmanagedType.U1)]
public byte BPB_Media; // 21
[MarshalAs(UnmanagedType.U2)]
public ushort BPB_FATSz16; // 22
[MarshalAs(UnmanagedType.U2)]
public ushort BPB_SecPerTrk; // 24
[MarshalAs(UnmanagedType.U2)]
public ushort BPB_NumHeads; // 26
[MarshalAs(UnmanagedType.U4)]
public ulong BPB_HiddSec; // 28
[MarshalAs(UnmanagedType.U4)]
public ulong BPB_TotSec32; // 32
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 474)]
public byte[] FAT1632Info;
[MarshalAs(UnmanagedType.U2)]
public ushort Signature;
}
我正在使用以下代码来获取结构:
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool ReadFile(IntPtr hFile, [Out] IntPtr lpBuffer, uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, [In] ref System.Threading.NativeOverlapped lpOverlapped);
public bool GetPartitionDetails()
{
uint BytesRead;
IntPtr BootSectorPtr = Marshal.AllocHGlobal(512);
PInvoke.FATBootSector BootSector;
System.Threading.NativeOverlapped Overlapped = new System.Threading.NativeOverlapped();
bool ret = PInvoke.ReadFile(this.Handle, BootSectorPtr, (uint)512, out BytesRead, ref Overlapped);
BootSector = (PInvoke.FATBootSector)Marshal.PtrToStructure(BootSectorPtr, typeof(PInvoke.FATBootSector)); // causes access violation
return true;
}
我希望我不必这样做,但我能想到的唯一替代方法是使用 IntPtr
遍历内存。有什么想法吗?
最佳答案
这里有不少问题。首先,您在滥用 FieldOffset
。当编译器无法为您布局结构时,您可以使用它。总是那是当你有 union 的时候。不要在这里使用 FieldOffset
。当然不要预先指定尺寸。同样,让编译器来做。对照原生版本检查它。
然后你不正确地处理数组。您不需要 fixed
,但您需要说明数组的长度。该结构的开头应如下所示:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct FATBootSector
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] BS_jmpBoot;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] BS_OEMName;
....
}
其余的问题都是由错误的类型转换引起的。 ULONG
在 C++ 中是一个 4 字节的无符号类型。这是 C# 中的 uint
。您使用的是 8 字节宽的 ulong
。
这是至少可以避免访问冲突的结构版本:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct FATBootSector
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] BS_jmpBoot;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] BS_OEMName;
public ushort BPB_BytsPerSec;
public byte BPB_SecPerClus;
public ushort BPB_RsvdSecCnt;
public byte BPB_NumFATs;
public ushort BPB_RootEntCnt;
public ushort BPB_TotSec16;
public byte BPB_Media;
public ushort BPB_FATSz16;
public ushort BPB_SecPerTrk;
public ushort BPB_NumHeads;
public uint BPB_HiddSec;
public uint BPB_TotSec32;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 474)]
public byte[] FAT1632Info;
public ushort Signature;
}
要转换 FAT16/FAT32 union ,您可能需要使用 fixed
。或者有两种 FATBootSector
类型。一个用于 FAT16,一个用于 FAT32。
关于c# - 处理奇数场偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24008698/
我正在尝试从第 4 到 9 页以及第 12 和 13 页上的单元格中清除所有内容(包括图像)。我有以下代码,但它正在清除第 3-9 和 12-15 页中的内容,我不知道为什么。 有什么想法吗? Sub
有没有办法增加极坐标图刻度标签(θ)的填充/偏移? import matplotlib import numpy as np from matplotlib.pyplot import figure,
我正在调用本地 API 并尝试以分页 样式进行操作。我有 n 张图片,我想将它们分成 n/4 行(每行 4 张图片)。因此,我正在调用我的 API,images/count,offset。但不知何故,
我的问题解释起来有点棘手,但无论如何我都会尝试。我有两个水平选项卡,当您单击它们时,会打开一个文本框内容。当他们被点击时,我试图“关注”他们。我在网上找到了很多资料,但除了我在下面显示的这段代码外,没
所以我有一个 float 的 div,我需要它始终向右 200 像素,并填充窗口的其余部分。有没有某种跨浏览器兼容的方法,我可以在不借助 javascript 的情况下使宽度填满页面的其余部分? 最佳
我有以下片段 $('html,body').animate({scrollTop: $('#menu').offset().top}, 'slow'); 单击链接时,我希望浏览器从#menu div
我目前正在为我的应用程序使用 JASidePanel,并且我有一个 UITableViewcontroller 和一个 UIRefreshControl 作为它的 ViewController 之一。
给出以下代码: imshow(np.arange(16*16).reshape(16,16)) cb = colorbar() cb.set_label("Foo") cb.set_ticks([0,
我是编程新手,我认为 VBA 是一个很好的起点,因为我在 Excel 中做了很多工作。 我创建了一个宏,它从输入框中获取一个整数(我一直使用 2、3 和 4 来测试),并创建该数字的一组 4 层层次结
我在 PHP 中有一个 unix 时间戳: $timestamp = 1346300336; 然后我有一个我想要应用的时区的偏移量。基本上,我想应用偏移量并返回一个新的 unix 时间戳。偏移量遵循这
演示:http://jsfiddle.net/H45uY/6/ 我在这里想做的是将 的左上角设为跟随鼠标。代码在没有段落的情况下工作正常(请参阅上面的演示),但是当您添加段落时,被向上推,鼠标位于盒
假设我们有两个由无符号长(64 位)数组表示的位图。我想使用特定的移位(偏移)合并这两个位图。例如,将位图 1(较大)合并到位图 2(较小)中,起始偏移量为 3。偏移量 3 表示位图 1 的第 3 位
通过在 pageViewController 中实现 tableView,tableView 与其显示的内容不一致。对此最好的解决办法是什么? 最佳答案 如果您的 TableView 是 View C
我设置了一个在 nib 中显示地点信息的地点配置文件。当我在标准屏幕流程中推送此 View 时,它工作正常。但是,当我从另一个选项卡推送此 View 时,UINavigationBar 似乎抵消了它,
如果我想选择 5 条记录,我会这样做: SELECT * FROM mytable LIMIT 5 如果我想添加偏移量,我会这样做: SELECT * FROM mytable OFFSET 5 LI
我有一个应用程序,其中某些 View 需要全屏,而其他 View 不需要全屏。在某些情况下,我希望背景显示在状态栏下方,所以我在 View 加载时使用它来使 Activity 全屏显示: window
在下图中,我进行绘制,结果位于 A 点,就在我手指接触的地方。 如何使图像显示在实际触摸上方约 40pt。 (二) 我正在使用经典的 coreGraphic UITouch 代码,如下所示: - (v
只要键盘处于事件状态,我就会尝试偏移 UITextField,效果很好,直到我尝试了表情符号布局。有没有办法检测键盘输入的类型,以便找出高度差?谢谢 最佳答案 不是使用 UIKeyboardDidSh
这是我的 Swift 代码 (AppDelegate.swift): var window: UIWindow? var rootViewController :UIViewController? f
我有一个 div 作为绝对定位的 body 的直接子节点,其 css 属性定义如下: div[id^="Container"] { display: block; position: a
我是一名优秀的程序员,十分优秀!