我需要生成一个10个字符的唯一ID(SIP/VOIP人员需要知道它是P-Charging-Vector头中的param icid值).每个字符应为26个ASCII字母之一(区分大小写),10个ASCII数字之一或连字符减号.
它必须是"全局唯一的(在生成id的机器之外)"并且足够"本地唯一(在生成id的机器内)",并且所有需要打包成10个字符,p!
这是我的看法.我是第一个编码'必须'编码全局唯一本地IP地址到base-63(它是一个无符号长整数,编码后将占用1-6个字符)然后尽可能多的当前时间戳(其一个time_t/long long int,编码后将占用9-4个字符,具体取决于编码的ip地址占用的空间大小.
我还在时间戳中添加了循环计数'i',以便在一秒钟内多次调用该函数时保留唯一性.
这是否足以在全球和本地独特,还是有另一种更好的方法?
拉夫
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
//base-63 character set
static char set[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-";
// b63() returns the next vacant location in char array x
int b63(long long longlong,char *x,int index){
if(index > 9)
return index+1;
//printf("index=%d,longlong=%lld,longlong%63=%lld\n",index,longlong,longlong%63);
if(longlong < 63){
x[index] = set[longlong];
return index+1;
}
x[index] = set[longlong%63];
return b63(longlong/63,x,index+1);
}
int main(){
char x[11],y[11] = {0}; /* '\0' is taken care of here */
//let's generate 10 million ids
for(int i=0; …Run Code Online (Sandbox Code Playgroud) 如何在x86进程中从x64进程中查找user32.dll函数地址?
编辑:我的意思是我的程序运行x64,我搜索x86地址.
我有一个小型的C程序,我希望从Linux移植到Windows.我可以用MinGW编译器做到这一点,我注意到它有两个不同的前缀,amd64和i586.我在i686计算机上,我想知道我是否使用和amd64架构编译我的C程序,它会在我的i686机器上运行吗?反之亦然?
更新:
是否有编译器编译C代码以在任何架构上运行?
void AppBuf(message_id_type msgID, int32 numPairs, va_list va)
{
int32 len = va_args(va, int32);
....
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在windows(32位和64位)以及linux 32位编译器上运行得非常好.对于以上所有,'len'的值为10.
但是在linux 64位(x86_64 GNU/Linux)上,我得到了一个非常大的值len(50462976),这会使代码的其余部分混乱并在崩溃中结束.
我曾经读过linux 64位编译器中的某些内容已经发生了变化,va_lists但我无法理解这一变化,所以我无法解决我的问题.
有人可以帮我解决这个问题吗?
谢谢.
晴朗
好的,以下是导致这一点的整个代码的详细信息:有人可以帮忙吗?提前致谢.
调用堆栈:
AppendBuffers(int msgID = 0x00000001,int numPairs = 0x00000001,char*va = 0x0007fcb0){注意:这是上面提到的问题所在(长度=非常大)}
LogMsg(int msgID = 0x00000001,int numPairs = 0x00000001,char*arguments = 0x0007fcb0)
LogMsgBuffersV(int msgID = 0x00000001,int numPairs = 0x00000001,char*arguments = 0x0007fcb0)
LogMsgBuffersV(int msgID = 0x00000001,int numPairs = 0x00000001,char*arguments = 0x0007fcb0)
LogMsgBuffers(int msgID = 0x00000001,int numPairs = 0x00000001,...)
实际代码:
void LogMsgBuffers(message_id_type …Run Code Online (Sandbox Code Playgroud) 给定一个指向T的指针,我想确定T是否跨越N字节对齐的地址.在实践中我真的只关心0-5字节大小的对象是否跨越8或16字节字节边界,但我写了这个通用版本:
template<class T, unsigned long N>
bool straddlesBoundary(T* obj)
{
unsigned long before = (unsigned long)obj & ~(N-1);
unsigned long after = ((unsigned long)obj + sizeof(T) - 1) & ~(N-1);
return before != after;
}
Run Code Online (Sandbox Code Playgroud)
基本上,将地址向下舍入到最接近的N字节对齐地址,然后将指针增量乘以T的大小减1(因为T在下一个边界上的右边不算作跨骑)并将其向下舍入到最近N字节对齐的地址,如果匹配,则表示它不会跨越.
有更快的方法吗?我刚刚做了这个,我不知道是否有标准检查.
编辑:注意,我假设T小于N.
我试图找到一个非常基本的C++内联x86-64汇编示例,类似于:
C/C++中的简单"Hello World"内联汇编语言程序
char msg[] = "Hello, world";
asm {
mov ax,4 // (I/O Func.)
mov bx,1 // (Output func)
lds cx, msg // (address of the string)
mov dx,6 // (lenght of the string)
int 0x21 // system call
}
Run Code Online (Sandbox Code Playgroud)
哪个适用于英特尔编译器.有人可以帮忙吗?
编辑关于操作系统我在Windows和Linux上有ICC - 让我们说Linux吧!
我在Delphi XE3中使用64位内联汇编程序遇到了这个问题,我不明白.
我试过这个,它适用于32位和64位
function test(a, b: integer): integer; assembler; register;
asm
mov eax, a
add eax, edx
end;
Run Code Online (Sandbox Code Playgroud)
但是,这仅适用于32位而不是64位,在64位编译时,但没有返回两个整数之和的正确结果.
function test(a, b: integer): integer; assembler; register;
asm
add eax, edx
end;
Run Code Online (Sandbox Code Playgroud)
我知道以前的FPU代码如FLD,STP工作在32位但它会在64位编译器上产生编译错误.知道如何处理64位浮点数吗?
我无法理解操作数如何FE FC FF FF导致0x9e7080.
我尝试了一些数学子/添加到当前地址,因为它应该是相对跳转,但结果仍然不等于0x9e7080.
instruction address | bytes | text form
L_009E737D | E9 FE FC FF FF | jmp 0x9e7080
Run Code Online (Sandbox Code Playgroud) 如何解决这个问题呢?
刚得到以下错误:
g ++输出:
duplicate symbol _game in:
/var/folders/w6/yqp0s0t92hl5g842hg8tztfr0000gn/T/main-62666f.o
/var/folders/w6/yqp0s0t92hl5g842hg8tztfr0000gn/T/Game-a5a31d.o
duplicate symbol _game in:
/var/folders/w6/yqp0s0t92hl5g842hg8tztfr0000gn/T/main-62666f.o
/var/folders/w6/yqp0s0t92hl5g842hg8tztfr0000gn/T/Write-83f8ee.o
Run Code Online (Sandbox Code Playgroud)
看来问题不在头文件中。
编辑:头文件看起来像这样:
#ifndef GAME_H
#define GAME_H
#include "Color.h"
#include "Tile.h"
class Game
{
public:
Game();
~Game();
Color getActivePlayer();
void setStarttile(Tile Firststarttile);
Color togglePlayer();
void setRunning(bool run);
char newActiveplayer;
void run();
void runsecondmethod();
private:
Game(const Game &);
Color Activeplayer;
Tile *Starttile;
bool Running;
}game;
#endif
Run Code Online (Sandbox Code Playgroud) 我的装配有点生疏,我试着让它再次变好.
显示意图的C代码:
void ask_me(int * data){
(*data)++;
}
Run Code Online (Sandbox Code Playgroud)
这是故意的愚蠢,但适合上下文.
我的工作大会:
_ask_me:
addq $1, (%rdi)
ret
Run Code Online (Sandbox Code Playgroud)
我想用这个lea指令作为训练.但我无法使其发挥作用:
_ask_me:
leaq 1(%rdi), %rdi
ret
Run Code Online (Sandbox Code Playgroud)
最差:
_ask_me:
movq (%rdi), %rcx
leaq 1(%rcx), %rdi
ret
Run Code Online (Sandbox Code Playgroud)
你能提醒我怎么做吗?
谢谢