标签: struct

将二进制文件读入结构

我正在尝试使用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)

示例代码从原始代码更改为使此问题更短.

如何将二进制数据从文件读入结构?

c# io struct binaryfiles

52
推荐指数
4
解决办法
6万
查看次数

在C++中定义类中的结构

能有人给我如何定义一个新的类型的示例结构在C++.

谢谢.

c++ struct class

52
推荐指数
4
解决办法
11万
查看次数

更改数组中struct的值

我想将结构存储在数组中,访问并更改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)

如果我将结构更改为类它可以工作.任何人都可以告诉我如何更改结构的值.

arrays struct swift

52
推荐指数
4
解决办法
3万
查看次数

C:结构定义中指向struct的指针

如何在此结构的定义中指向下一个结构的指针:

typedef struct A {
  int a;
  int b;
  A*  next;
} A;
Run Code Online (Sandbox Code Playgroud)

这是我第一次写它但它不起作用的方式.

c struct pointers

51
推荐指数
5
解决办法
7万
查看次数

C++类成员的默认值是什么

结构成员和c ++中类成员的默认值是什么,以及这些规则如何不同(例如,类/结构/基元/等之间)?是否存在有关默认值的规则不同的情况?

c++ struct class default-value

51
推荐指数
2
解决办法
3万
查看次数

C++中的struct padding

如果我有一个structC++,有没有办法安全地读/写一个跨平台/编译器兼容的文件?

因为如果我理解正确,每个编译器"填充"基于目标平台不同.

c++ struct

51
推荐指数
3
解决办法
5万
查看次数

非唯一枚举值

我试图掩盖edi文件中的索引位置...我有一种情况,根据情况可以在索引中有2或3个东西.使用枚举隐藏"魔术数字"会很酷,并且很惊讶你可以将多个枚举分配给相同的值,如下所示:

public enum Color
{
    Red = 1,
    Blue = 1,
    Green = 1
}
Run Code Online (Sandbox Code Playgroud)

并且编译器对此很满意.我没想到这会起作用.我不需要回到枚举,所以我不担心回去,但这闻起来很时髦.为什么CLR允许枚举的多个值,我应该使用结构吗?(结构似乎比枚举更重要,这似乎有效)

c# enums struct

51
推荐指数
5
解决办法
2万
查看次数

Golang:何时使用指针

我是Go语言的新手,并且只有很少的C/C++背景,所以我很自然地想到何时使用指针以及什么时候不使用指针.虽然这个问题可能被认为是开放式的,但我想知道何时返回结构以及何时返回指针的一些指导原则(等同于何时接受结构/指针作为参数).

根据我的猜测,以下陈述成立:

  1. 结构体按值传递给函数.也就是说,在将结构传递给函数时会生成结构的副本.
  2. 如果我想通过引用传递结构,那么我会在函数定义中使用指针参数,并在调用函数时使用addressof运算符.
  3. 我想要通过引用传递结构的原因是因为我传入的结构要么很大,而且会对内存产生负担以使其按值传递(不太可能)或者如果我想对其进行更改复制我传入(更有可能).
  4. 作为3.)的推论,我应该通过值,除非我有上述原因之一通过引用.

我的假设是否正确?或者我错过了指针上的标记?

struct pointers go

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

在一个结构中,使用一个数组字段访问另一个数组字段是否合法?

例如,请考虑以下结构:

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.

c c++ arrays struct

51
推荐指数
5
解决办法
4449
查看次数

50
推荐指数
4
解决办法
6万
查看次数

标签 统计

struct ×10

c++ ×4

c ×3

arrays ×2

c# ×2

class ×2

pointers ×2

binaryfiles ×1

default-value ×1

enums ×1

go ×1

initialization ×1

io ×1

member ×1

swift ×1