1.znԴ?源码?
2.ZNHG600光猫最新破解超级密码方法详解
3.c++大学生个人消费管理系统 大神救命!!源码急用!源码!源码!源码!源码bbc直播源码
4.ç¨å«äººç½ä¸çFLASH
5.谈一谈 ABI,源码 C++ ABI, Rust ABI 的稳定性 (下)
znԴ??
Prometheus TSDB的Index索引存储格式详解
Prometheus在数据存储过程中,当Head中的源码时间范围达到一定阈值时,会将数据归档到Block中,源码以保持高效查询性能。源码这个过程涉及Compact操作,源码具体实现见tsdb/db.go的源码Compact方法。整个系统结构包括多个文件,源码如G2KPG4ZND4WA3GZYB和ULID标识的源码Block,其中包含时间范围内的源码样本数据,chunk和index文件组织了这些数据。
Index文件是关键,它详细记录了Series的索引信息。首先,TOC(目录)部分包含文件中Symbol Table、Series、Label Indices等的索引位置,固定长度字节,beanvalidation源码分析便于快速定位。Symbol Table存储Series中的标签值对,按照升序排序,包含每个标签值的长度、索引以及CRC校验。
Series部分描述了每个Series对Chunk的引用,包括系列长度、标签对数量、标签值索引引用、chunk位置信息以及元数据,采用差分编码节省空间。Label Indices记录每个标签名下的所有值,同样按照索引存储,便于快速查找。Postings则记录每个标签值对对应的所有系列引用。
Label Offset Table用于记录标签值在Label Index中的位置,而Postings Offset Table则记录每个键值对对应的Postings索引。这些结构共同构成了Prometheus查询的核心索引,理解它们对于理解查询流程至关重要。
本文深入剖析了Prometheus的源码和文档,揭示了Index文件的详细结构,接下来将深入讲解查询流程和Block中Chunk的抽奖源码介绍格式。后续内容将更加详细地揭示Prometheus如何利用这些结构实现高效的数据检索。
ZNHG光猫最新破解超级密码方法详解
最近家中光猫(型号为ZNHG)的配置模式发生了变化,导致之前的超级管理员密码失效。经过多次尝试,发现先前的破解方法不再有效,因此我决定自己研究新的破解策略。
原破解步骤中,通过在Chrome浏览器输入光猫的IP地址(..1.1)进入管理界面,并按照特定路径进行操作,可以找到超级管理员密码。但如今,跳转后的页面显示的密码为位的数字和小写字母组合,这与先前的明文密码形式不同。
观察登录页面的源代码后,我发现了一些关键信息。登录页面中引用了名为md5.js的文件,并且在处理用户输入密码时,会计算其MD5值并与服务器端的乱码进行对比。这意味着,超级管理员密码的计算过程涉及到MD5哈希函数。
由于超管密码具有特定格式(前缀telecomadmin加8位数字),我们可以采用暴力破解的emlue源码分析方法来尝试所有可能的组合。通过计算这些组合的MD5值,并与服务器端的乱码进行比较,最终找到匹配的密码。
针对这一需求,我提供了一个C#代码示例。如果您熟悉GitHub Actions,可以通过将其代码应用于GitHub上的服务器环境,实现自动破解过程。对于不熟悉此技术的用户,我提供了一个简单的小工具,需要在运行时具备.NET Framework 4.5.2或更高版本。
希望上述信息能帮助您解决问题,欢迎在社区分享您的成果。别忘了关注我的其他文章,了解更多关于路由器的相关内容。感谢您对我的支持!
c++大学生个人消费管理系统 大神救命!!急用!!!!黄石网站源码
工大课设吧,我这里有,你看看有没有帮助,,很多呀,我要怎么给你,给你分享吧。。
直接给你吧。。。。。。希望对你有所帮助!!!!!
#include <stdio.h>
#include <stdlib.h>
#define FilePath1 "Myinfor.dat"
#define FilePath2 "Myinfor.txt"
#define Status int
#define OK 1
#define Error 0
#define NotFound 2
typedef struct Infor{
int month;
int spxf;
int fz;
int znjy;
int sdf;
int ylf;
int cx;
int byzhf;
} Infor,*Infor1;
typedef struct pType{
int no;
int data;
}pType;
void menu(void);
void input1(Infor *newI,int mon);
void input(Infor *newI);
void writeinfor(Infor *newI);
void changeFormat(void );
Status search(Infor *a,int mon);
void paixu(Infor *a);
void modify(Infor *a,int mon);
void delRecord(int mon);
void xuanze(int item);
void xiugai(int m);
int panduan(Infor *a,int mon);
void main()
{ while(1)
{ menu(); }
}
void menu(void)/*菜单*/
{ int item;
printf("\n………\"我的大学\"生活消费管理系统…………\n\n");
printf("\t\t1.…………录 入 数 据………….\n");
printf("\t\t2.…………查 看 数 据………….\n");
printf("\t\t3.…………修 改 数 据………….\n");
printf("\t\t4.…………查 询 数 据………….\n");
printf("\t\t5.…………排 序 数 据………….\n");
printf("\t\t6.…………删 除 数 据………….\n");
printf("\t\t0.…………退 出 系 统………….\n");
printf("请输入要进行的操作: " );
scanf("%d",&item);
if(item>6 || item<-1)
{ printf("请重新输入要进行的操作: " );
menu(); }
else xuanze( item); }
int panduan(Infor *a,int mon)
{ int item;
FILE *fp;
fp=fopen(FilePath1,"ab+");
if(fp==NULL)
{ printf("无法创建文件:%s",FilePath1);
exit(0); }
if(mon<=)
{ item=search(a,mon);
while(item==OK)
{ printf("输入月份已存在请重新输入要建立的月份:\n");
scanf("%d",&mon);
item=search(a,mon); } }
else{
printf("您输入的月份有误请重新输入:\n");
scanf("%d",&mon);
panduan(a,mon); }
fclose(fp);
return mon; }
void xuanze(int item)
{ int mon;
Infor *a;
a=(Infor *)malloc(sizeof(Infor));
switch(item)
{ case 0: //getchar();/*退出*/
//getchar();
printf("\n ……………………欢迎使用…………………………");
printf(" \n\t.\t\t\t\t\t\t.");
printf(" \n\t.\t\t\t\t\t\t.");
printf(" \n\t.\t\t\t\t\t\t.");
printf(" \n\t.\t\t\t\t\t\t.");
printf(" \n\t. \"我的大学\"生活消费管理系统 .");
printf(" \n\t.\t\t\t\t\t\t.");
printf(" \n\t.\t\t\t\t\t\t.");
printf(" \n\t.\t\t\t\t\t\t.");
printf(" \n\t.\t\t\t\t\t\t.");
printf(" \n\t. 欢迎下次使用 .");
printf(" \n\t.\t\t\t\t\t\t.");
printf(" \n\t.\t\t\t\t\t\t.");
printf(" \n\t.\t\t\t\t\t\t.");
printf(" \n\t.\t\t\t\t\t\t.");
//printf("\n\"我的大学\"生活消费管理系统\n\n\n\n");
//printf("\t\t\t\t\t\n. 欢迎下次使用 \n\n\n\n");
printf("\n……………………………………………………………\n\n\n\n");
exit(1);
break;
case 1:
printf("请输入要建立的月份:\n");
scanf("%d",&mon);
mon=panduan(a,mon);
input1(a,mon);
writeinfor(a);
break;
case 2:
changeFormat();
break;
case 3:
printf("请输入要查找的月份:\n");
scanf("%d",&mon);
item=search(a,mon);
mon=a->month;
if (item!=OK) printf("\n没有符合条件的记录!\n");
else
{
printf("\n 记录月份 食品消费 房租 子女教育费用 水电费 医疗费 储蓄 本月总花费 \n");
printf("------------------------------------------------------- \n");
printf("%7d %8d %8d %8d %8d %8d %8d %8d\n",a->month,a->spxf,a->fz,a->znjy,a->sdf,a->ylf,a->cx,a->byzhf);
input(a);
modify(a,mon); }
break;
case 4:
printf("请输入要查找的月份:\n");
scanf("%d",&mon);
item=search(a,mon);
if (item!=OK) printf("\n没有符合条件的记录!\n");
else{
printf("\n记录月份 食品消费 房租 子女教育费用 水电费 医疗费 储蓄 本月总花费 \n");
printf("------------------------------------------------------- \n");
printf("%7d %8d %8d %8d %8d %8d %8d %8d\n",a->month,a->spxf,a->fz,a->znjy,a->sdf,a->ylf,a->cx,a->byzhf);
}
break;
case 5:
printf("请输入要查找的月份:\n");
scanf("%d",&mon);
item=search(a,mon);
if (item!=OK) printf("\n没有符合条件的记录!\n");
else
paixu(a);
break;
case 6:
printf("请输入要查找的月份:\n");
scanf("%d",&mon);
item=search(a,mon);
mon=a->month;
if (item!=OK) printf("\n没有符合条件的记录!\n");
else
{
printf("------------------------------------------------------- \n");
printf("%7d %8d %8d %8d %8d %8d %8d %8d\n",a->month,a->spxf,a->fz,a->znjy,a->sdf,a->ylf,a->cx,a->byzhf);
delRecord(mon); }
break;}
free(a);}
void input1(Infor *newI,int mon)
{ printf("\n请依次输入数据[说明:中间以空格符隔开]:\n( 食品消费 房租 子女教育费用 水电费 医疗费 储蓄 )\n");
scanf("%d%d%d%d%d%d",&newI->spxf,&newI->fz,&newI->znjy,&newI->sdf,&newI->ylf,&newI->cx);
newI->month=mon;
newI->byzhf=newI->spxf+newI->fz+newI->znjy+newI->sdf+newI->ylf+newI->cx;
fflush(stdin);}
void input(Infor *newI)
{
printf("\n请依次输入数据[说明:中间以空格符隔开]:\n( 食品消费 房租 子女教育费用 水电费 医疗费 储蓄 )\n");
scanf("%d%d%d%d%d%d",&newI->month,&newI->spxf,&newI->fz,&newI->znjy,&newI->sdf,&newI->ylf,&newI->cx);
newI->byzhf=newI->spxf+newI->fz+newI->znjy+newI->sdf+newI->ylf;
fflush(stdin);}
void writeinfor(Infor *newI)
{
FILE *fp;
fp=fopen(FilePath1,"ab+");
if(fp==NULL)
{ printf("无法创建文件:%s",FilePath1);
exit(0);}
fwrite(newI,sizeof(Infor),1,fp);
fclose(fp);
printf("数据录入成功!\n");}
void changeFormat(void)
{
FILE *fp1,*fp2;
Infor *a;
a=(Infor *)malloc(sizeof(Infor));
fp1=fopen(FilePath1,"rb+");
if(fp1==NULL)
{ printf("无法找到文件:%s\n",FilePath1);
return ;}
fp2=fopen(FilePath2,"wt+");
if(fp2==NULL)
{ printf("无法创建文件:%s\n",FilePath2);
return ;
}
//fputs(" \n!@#¥%……&*(&……¥#@@?\"我的大学\"生活消费管理系统!@#¥%……&*(&……¥#@@!n\n",fp2);
fputs("记录月份 食品消费 房租 子女教育费用 水电费 医疗费 储蓄 本月总花费 \n",fp2);
fputs("---------------------------------------------------- \n",fp2);
printf("\n记录月份 食品消费 房租 子女教育费用 水电费 医疗费 储蓄 本月总花费 \n");
printf("--------------------------------------------------- \n");
rewind(fp1);
fread(a,sizeof(Infor),1,fp1);
while(!feof(fp1))
{ printf("%7d %8d %8d %8d %8d %8d %8d %8d\n",a->month,a->spxf,a->fz,a->znjy,a->sdf,a->ylf,a->cx,a->byzhf);
fprintf(fp2,"%7d %8d %8d %8d %8d %8d %8d %8d\n",a->month,a->spxf,a->fz,a->znjy,a->sdf,a->ylf,a->cx,a->byzhf);
fread(a,sizeof(Infor),1,fp1);}
fputs("--------------------------------------------------- \n",fp2);
fputs("关闭本程序继续原程序!\n",fp2);
fclose(fp1);
fclose(fp2);
system(FilePath2);
remove(FilePath2);}
Status search(Infor *a,int mon)
{
FILE *fp1;
int isfound=0;
//printf("请正确输入要查询的月份:");
//scanf("%d",&mon);
fflush(stdin);
fp1=fopen(FilePath1,"rb+");
if(fp1==NULL)
{ printf("无法找到文件:%s\n",FilePath1);
return Error; }
rewind(fp1);
fread(a,sizeof(Infor),1,fp1);
while(!feof(fp1))
{ if(a->month==mon)
{ isfound=1;
Break; }
else
{ isfound=0; }
fread(a,sizeof(Infor),1,fp1);}
fclose(fp1);
if(isfound)
return OK;
else
return NotFound; }
void paixu(Infor *a)
{ int i=0,j=0,flag=0,t;
pType px[8]={ { 0,0}};
char str[8][]={ "记录月份","食品消费"," 房租", "子女教育费用", "水电费"," 医疗费"," 储蓄"," 本月总花费"};
for(;i<8;i++)
px[i].no=i;
px[0].data=a->month;
px[1].data=a->spxf;
px[2].data=a->fz;
px[3].data=a->znjy;
px[4].data=a->sdf;
px[5].data=a->ylf;
px[6].data=a->cx;
px[7].data=a->byzhf;
for(i=1;i<8;i++)
{
flag=0;
for(j=0;j<8-i;j++)
if(px[j].data>px[j+1].data)
{ t=px[j].data;
px[j].data=px[j+1].data;
px[j+1].data=t;
t=px[j].no;
px[j].no=px[j+1].no;
px[j+1].no=t;
flag=1; }
if(flag==0) break;}
printf("\n");
for(i=0;i<8;i++)
{ printf(" %s",str[px[i].no]);}
printf("\n----------------------------------------------------- \n");
for(i=0;i<8;i++)
{ printf("%8d ",px[i].data); }
printf("\n");}
void modify(Infor *a,int mon)
{ FILE *fp1,*fp2;
Infor *b;
b=(Infor *)malloc(sizeof(Infor));
fp1=fopen(FilePath1,"rt");
fp2=fopen("temp.dat","wt+");
rewind(fp1);
fread(b,sizeof(Infor),1,fp1);
while (!feof(fp1))
{ if(b->month==mon)
{
fwrite(a,sizeof(Infor),1,fp2);
}
else
{ fwrite(b,sizeof(Infor),1,fp2);
}
fread(b,sizeof(Infor),1,fp1);
}
fclose(fp1);
fclose(fp2);
remove(FilePath1);
rename("temp.dat",FilePath1);
printf("修改数据成功!\n" );
changeFormat();
}
void delRecord(int mon)
{
FILE *fp1,*fp2;
Infor *b;
b=(Infor *)malloc(sizeof(Infor));
fp1=fopen(FilePath1,"rt");
fp2=fopen("temp.dat","wt+");
rewind(fp1);
fread(b,sizeof(Infor),1,fp1);
while (!feof(fp1))
{
if(b->month!=mon)
fwrite(b,sizeof(Infor),1,fp2);
fread(b,sizeof(Infor),1,fp1);
}
fclose(fp1);
fclose(fp2);
remove(FilePath1);
rename("temp.dat",FilePath1);
printf("删除数据成功!\n" );
changeFormat();
}
ç¨å«äººç½ä¸çFLASH
åºè¯¥ä¸ä¼é æç»æµä¸çæ失ï¼å 为没æå©çä»·å¼æå²çªåå¨ï¼ä½æ¯ä½åæ¯ä½è 个人æå财产ï¼ååä¸æ²¡æå ¬å¼çæºç æ¯æçæçï¼åªæ¯å¦ä»ç¤¾ä¼ä¸æ¯æ¶åå°ä¸ªäººæ ¸å¿å©çé½æ²¡æ人å»æå»è¿½ç©¶ï¼å¦æ转载äºä¹æ²¡æä»éº½ã
谈一谈 ABI, C++ ABI, Rust ABI 的稳定性 (下)
本文撰写于年9月2日。
在上一篇文章中,我们讨论了C++的ABI稳定性。实际上,Rust的ABI稳定性也有着类似的含义。我们所说的ABI稳定性,指的是同一套代码的二进制在不同编译器下能够相互兼容。
目前,Rust还没有提供稳定ABI的保证。在ABI不稳定的情况下,库通常无法保证ABI的兼容性。这也是为什么Rust经常以源代码的形式分发,所有部分都需要从源代码重新编译的原因之一(ABI不稳定,直接分发binary可能会遇到兼容性问题)。
尽管没有给出保证,但这并不意味着每个版本都会造成破坏。
对于数据布局,Rust提供的保证并不多。其中一个原因是Rust允许编译器重排类型中的变量位置以寻求更小的结构大小。
在C这样的语言中,因为成员b要求A以位对齐,所以a、c之后都需要填充位的padding。
而Rust允许编译器调换a、b、c在内存中的位置,这样可以得到更紧凑的结构。具体介绍可以参考相关文档。
除此之外,还有一个典型的原因是Rust允许大小为0的类型,以及niche optimization。比如Option大于占用的大小和一个NonNull类型是相同的。利用NonNull中的Null值代表了不存在的情况。
给大家展示一个常见类型布局图:
为了与C互操作,对于Rust来说,引入了一个#[repr(C)]的标志。这个标志告诉Rust编译器,用C的布局方式来布局这个类型。对于有这些标记的类型,它们的ABI是稳定的,并且与C ABI规定的一致。
Rust对于layout能给出的保证都在这个页面里面。其他的真的就没有办法保证了。
Rust中允许很多同名函数,翻译成binary的时候也需要进行名字修饰。当前的修饰方式是编译器实现细节,没有给出过任何保证,部分采用了和C++ Itanium ABI相似的策略,部分采用了哈希后缀。
Rust RFC 试图给出一个稳定的命名修饰方案,目前未默认打开。
目前不应对Rust的命名修饰做出任何假设。
Rust中动态派发的方法是trait。方法依照trait组织在了一起。
对于这样的情况,Rust编译器会为impl Hello的类型生成一个虚表。对于object safe的trait,可以把一个trait想象成一个虚表。虚表的布局目前还没有保证,但不妨碍我们看看现在的实现。
第0个指针放Destructor,后面跟着字节放size和align。再后面放具体的函数指针。
可以看到Rust为foo生成的LLVM IR(target x-)。
函数入参a.0和a.1分别就是"对象的地址"和"虚表的地址"。可以看到虚表指针a.1用了readonly来修饰。
_ZNplayground3foohaee3acfccE就是被修饰过后的playground::foo的名字。
这3行是
后面3行也是类似
对于一个稳定的ABI而言,虚表的布局也需要稳定。
可以想象,破坏ABI兼容性有多么容易。当我们改变一下trait里面两个方法的顺序时,就会改变虚表的布局。之前编译的binary就不能用了,而从源代码编译则完全不受影响。
Rust中有panic和unwind机制。对于Rust ABI稳定来说,它们也是需要被稳定的一部分。目前人们在panic与外部语言交互的方式上进行努力。
默认是extern "Rust",也可以用extern "C"来标记某些函数需要按照C语言调用约定来。
Rust没有稳定的ABI,稳定ABI的目标主要通过C部分来实现。有一个库abi_stable就试图做这件事情,它把Rust类型变成ABI稳定的Rust类型,再跨二进制传递。
原则上来说,不应该跨二进制传递任何repr(Rust)的类型,因为没有办法保证其ABI兼容性。而绝大多数Rust库的作者也没有/也不会把ABI兼容性放在首要考虑的目标。
有趣的是,因为C++的ABI已经稳定了,所以我们可以在外部模拟(猜测)C++对象的布局。这个cxx库就做了这个。
将Rust ABI稳定化的新实验已经开始了。crABI就在试图稳定化Rust ABI,但距离真正稳定还有很长一段路要走,不过至少有人开始了努力。
2024-12-22 11:55
2024-12-22 11:33
2024-12-22 11:24
2024-12-22 10:42
2024-12-22 10:03
2024-12-22 09:17