我有一个打包的结构,如下所示
typedef struct packed {
logic bit1;
logic [7:0] byte1;
} MyPackedStruct;
MyPackedStruct myPackedStruct;
Run Code Online (Sandbox Code Playgroud)
是否有任何SV内置函数,我可以使用它来打印类似于上面的结构,但有更多的字段,而不必编写我自己的方法来打印每个字段使用一个
$display(...,myPackedStruct.field_name)?
我刚刚了解了填充,我试图对其进行一些测试,我尝试打包这个结构:
struct B {
int a,b,c;
string s;
char x;
string t;
char y;
string u;
}__attribute__((packed)) ;
Run Code Online (Sandbox Code Playgroud)
但我收到这个警告:
warning: ignoring packed attribute because of unpacked non-POD field 'std::string B::u'
string u;
Run Code Online (Sandbox Code Playgroud)
这是否意味着包含的结构strings不能被打包?还有其他方法吗?如果是的话,会影响性能吗?
在C中是否可以将以下结构的大小设为2?
#include <stdio.h>
struct union_struct {
char foo;
char bar : 2;
union {
char foobar1 : 6;
char foobar2 : 6;
};
};
int main(void)
{
printf("size of union struct: %d\n", sizeof(struct union_struct));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出,用gcc编译:
size of union struct: 3
如何使用C将文件"打包"和"写入"到文件中,以便:
struct a {
uint64_t a;
char* b;
uint16_t c;
} a;
a b;
b.a = 3;
b.b = "Hello";
b.c = 4;
被写入文件
00 00 00 00 00 00 00 03 48 65 6c 6c 6f 00 00 04
我正在抓取网站信息,其中涉及获取磁力链接的 sha1 哈希值。
我用一个简单的方法获得了所有磁力链接preg_match_all,但在结果中我得到了奇怪的结果,我知道十六进制形式的磁力哈希值有 40 个字符长,但我也得到了返回 32 个字符长的字符串的结果,其中包含其他非十六进制值。
我的结果中有两个例子,首先是磁力链接内的正常 40 十六进制哈希值,
array
0 => string 'F5AD2D170C033736FD987106F04C3ABD6DF41D14' (length=40)
Run Code Online (Sandbox Code Playgroud)
还有其他奇怪的结果,我不明白哈希值是 32 个非十六进制值,
array
0 => string 'VPR33QQM3L6BFU5FGOZXMBNORAFFSZWW' (length=32)
Run Code Online (Sandbox Code Playgroud)
哈希是否以某种方式打包?我知道它还没有完成,pack('H*', $hash)因为它返回哈希的二进制?正如我测试的那样,磁力链接确实有效。
更重要的是,您可以在该网站上看到这些哈希值的使用
将鼠标悬停在磁力链接上并查看磁力哈希。
谢谢
考虑以下结构:
typedef struct __attribute__((packed)) a{
int a1;
int b2;
char cArray[5];
int c3;
} Mystruct;
Run Code Online (Sandbox Code Playgroud)
现在在我的代码中,我这样做:
char source[50];
Mystruct mm;
//...
//initialization and other codes
//...
memcpy(&mm,source,sizeof(mm));
Run Code Online (Sandbox Code Playgroud)
我试图从字符串填充结构(从文件更具体),因此我不想填充.但是认为包装也会影响性能.
所以我的问题是,还有其他方法可以实现我想要的吗?
是否可以使用c ++中的类的成员变量执行相同的操作(从字符串填充)?如果有,怎么样?
我在 EEPROM (4KB) 中有很多配置数据,我以打包结构读取这些数据。在我的固件中,我需要非常频繁地读取/更改这些值,并且打包结构的性能不是最佳的,所以我有第二个结构,它完全相同,只是没有打包。我必须将每个值从打包结构中一一复制到解压结构中,这很容易出错,因为当我向打包结构中添加一个值时,我还必须记住将其添加到复制函数中。
有没有更聪明的方法来做到这一点?
我正在尝试构建一个简单的自定义应用程序层协议,本质上是携带时间戳以及一些其他有用的信息,以便在不同的 Linux 系统之间执行少量网络测量。
在我最初的想法中,就 Linux 系统而言,该实现应该在不同平台(x86、ARM 等)之间尽可能可移植。
为了管理标头,我创建了以下结构:
struct myhdr {
__u8 reserved; // 1 byte
__u8 ctrl; // 1 byte
__u16 id; // 2 bytes
__u16 seq; // 2 bytes
__u16 len; // 2 bytes
struct timeval sendtime; // 8 or 16 bytes
};
Run Code Online (Sandbox Code Playgroud)
之后,一些有效负载数据可能存在也可能不存在(如果 len=0)。由于这些数据必须通过网络发送,如果我没记错的话,我需要打包结构,而不需要任何对齐填充。
我的疑问实际上是这是否可以被认为是已经打包的,主要是因为struct timeval, 的存在来携带时间戳。
32位系统下,struct timeval应该是8字节。在64位系统下,它应该是16字节(刚刚通过打印测试过sizeof(struct timeval))。
在 32 位系统下,由于 1+1+2+2+2 字节 = 8 字节(即 的大小),可以安全地假设它已经打包了sendtime?或者在任何情况下都会添加填充,以便将每个字段与最后一个字段(最大的字段)对齐?
那么在最后一个字段为 16 字节的 64 位系统中会发生什么?我认为无论如何,该结构将不再“按布局打包”(这是正确的吗?)。
添加__attribute__((packed))足够的且始终必要的内容来确保在针对不同平台编译代码时结构被打包?有更好的解决方案吗?
我缺少一个部分来解决我的问题。
如果我执行此操作:
TYPES: ty_p2 TYPE p DECIMALS 2.
DATA: lv_test TYPE ty_p2.
lv_test = '100.00' * '3.00'.
Run Code Online (Sandbox Code Playgroud)
我在调试器视图上的程序(特定程序)中得到了这个结果:
这是我期望的实际结果。
我在调试器视图上的程序(标准增强)中得到了这个结果:
这不是正确的结果,就好像它是 100*3000 并且它没有考虑乘法右侧运算符的逗号。
你如何解释这一点?
是否有一条指令适用于 ABAP 会话的上下文,并且可以在乘法期间修改压缩数的解释?或者你知道它从哪里来吗?
谢谢 !
我有以下内存布局(伪代码):
struct {
union {
fieldA : 45;
struct {
fieldB1 : 12;
fieldB2 : 33;
}
}
fieldC : 19;
}
Run Code Online (Sandbox Code Playgroud)
即,字段A的存储器有时可以用于其他目的(字段B1和B2)。我希望这个结构尽可能压缩,即大小为 64 位。
似乎无论我做什么(例如打包属性),联合总是在 fieldC 之前填充 3 位以获得 48 位(6 字节)(当然它也被填充)。