1.znԴ?源码?
2.ZNHG600光猫最新破解超级密码方法详解
3.c++大学生个人消费管理系统 大神救命!!源码急用!源码!源码!源码!源码直客商城源码
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等的索引位置,固定长度字节,单页官网源码便于快速定位。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位数字),我们可以采用暴力破解的多接口短网址源码方法来尝试所有可能的组合。通过计算这些组合的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,但距离真正稳定还有很长一段路要走,不过至少有人开始了努力。