我正在尝试使用C#读取二进制数据.我有关于我想要阅读的文件中数据布局的所有信息.我能够读取数据"chunk by chunk",即获取前40个字节的数据将其转换为字符串,获得接下来的40个字节.
由于至少有三种略有不同的数据版本,我想将数据直接读入结构中.它只是通过"逐行"阅读它而感觉更加正确.
我尝试了以下方法但无济于事:
StructType aStruct;
int count = Marshal.SizeOf(typeof(StructType));
byte[] readBuffer = new byte[count];
BinaryReader reader = new BinaryReader(stream);
readBuffer = reader.ReadBytes(count);
GCHandle handle = GCHandle.Alloc(readBuffer, GCHandleType.Pinned);
aStruct = (StructType) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(StructType));
handle.Free();
Run Code Online (Sandbox Code Playgroud)
该流是一个打开的FileStream,我已经开始从中读取.我AccessViolationExceptio在使用时得到了一个Marshal.PtrToStructure.
由于我对文件末尾的数据不感兴趣,因此该流包含的信息比我尝试阅读的要多.
结构定义如下:
[StructLayout(LayoutKind.Explicit)]
struct StructType
{
[FieldOffset(0)]
public string FileDate;
[FieldOffset(8)]
public string FileTime;
[FieldOffset(16)]
public int Id1;
[FieldOffset(20)]
public string Id2;
}
Run Code Online (Sandbox Code Playgroud)
示例代码从原始代码更改为使此问题更短.
如何将二进制数据从文件读入结构?
我想将结构存储在数组中,访问并更改for循环中结构的值.
struct testing {
var value:Int
}
var test1 = testing(value: 6 )
test1.value = 2
// this works with no issue
var test2 = testing(value: 12 )
var testings = [ test1, test2 ]
for test in testings{
test.value = 3
// here I get the error:"Can not assign to 'value' in 'test'"
}
Run Code Online (Sandbox Code Playgroud)
如果我将结构更改为类它可以工作.任何人都可以告诉我如何更改结构的值.
如何在此结构的定义中指向下一个结构的指针:
typedef struct A {
int a;
int b;
A* next;
} A;
Run Code Online (Sandbox Code Playgroud)
这是我第一次写它但它不起作用的方式.
结构成员和c ++中类成员的默认值是什么,以及这些规则如何不同(例如,类/结构/基元/等之间)?是否存在有关默认值的规则不同的情况?
如果我有一个structC++,有没有办法安全地读/写一个跨平台/编译器兼容的文件?
因为如果我理解正确,每个编译器"填充"基于目标平台不同.
我试图掩盖edi文件中的索引位置...我有一种情况,根据情况可以在索引中有2或3个东西.使用枚举隐藏"魔术数字"会很酷,并且很惊讶你可以将多个枚举分配给相同的值,如下所示:
public enum Color
{
Red = 1,
Blue = 1,
Green = 1
}
Run Code Online (Sandbox Code Playgroud)
并且编译器对此很满意.我没想到这会起作用.我不需要回到枚举,所以我不担心回去,但这闻起来很时髦.为什么CLR允许枚举的多个值,我应该使用结构吗?(结构似乎比枚举更重要,这似乎有效)
我是Go语言的新手,并且只有很少的C/C++背景,所以我很自然地想到何时使用指针以及什么时候不使用指针.虽然这个问题可能被认为是开放式的,但我想知道何时返回结构以及何时返回指针的一些指导原则(等同于何时接受结构/指针作为参数).
根据我的猜测,以下陈述成立:
我的假设是否正确?或者我错过了指针上的标记?
例如,请考虑以下结构:
struct S {
int a[4];
int b[4];
} s;
Run Code Online (Sandbox Code Playgroud)
写作s.a[6]并期望它等于是合法的s.b[2]吗?就个人而言,我觉得它必须是C++中的UB,而我不确定C.但是,我没有找到任何与C和C++语言相关的内容.
更新
有几个答案建议确保字段之间没有填充以使代码可靠地工作的方法.我想强调的是,如果这样的代码是UB,那么填充缺失是不够的.如果它是UB,那么编译器可以自由地假设访问S.a[i]和S.b[j]不重叠,并且编译器可以自由地重新排序这样的存储器访问.例如,
int x = s.b[2];
s.a[6] = 2;
return x;
Run Code Online (Sandbox Code Playgroud)
可以转化为
s.a[6] = 2;
int x = s.b[2];
return x;
Run Code Online (Sandbox Code Playgroud)
总是回来2.