小编far*_*dve的帖子

我如何base58编码一个字符串?

char (* text)[1][45+1];
text = calloc(5000,(130+1));
strcpy(0[*text],"sometext)");
Run Code Online (Sandbox Code Playgroud)

现在我想将"sometext"编码为base58,但是,我不知道如何,奇怪的是,在C中没有一个BASE58的例子.

我感兴趣的base58编码使用这些符号:

123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ

它已被优化以减少误读的风险,因此例如0和'O'都消失了.

PS不要介意变量的奇怪分配和声明,我正在试验.

c base

8
推荐指数
3
解决办法
1万
查看次数

C中的快速字符串比较

我目前有这种循环

while(1)
{
    generate_string(&buffer);

    for(int i = 0; i < filelines; i++)
    {
        if(strcmp(buffer,line[i]) == 0)
        {
           /*  do something  */
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个包含几百万个字符串的文件(希望很快就会减半),所有这些字符串的数量都存储在filelines中

line [i]基本上是存储字符串本身的位置.

目前,由于这些百万字符串的比较,函数generate_string(&buffer); 每秒执行约42次.有没有更快的方法在C中进行字符串比较?

c string compare

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

如何在Windows中获取PCI区域大小?

我需要扫描我的PCI总线并获取特定供应商的特定设备的信息.我的目标是找到AMD显卡的PCI区域大小,以便将该卡的PCI内存映射到用户空间,以便进行i2c传输并查看来自各种传感器的信息.

为了扫描PCI总线,我在大约一年前下载并编译了pciutils 3.1.7 for Windows x64.据说它使用DirectIO.

这是我的代码.

int scan_pci_bus()
{
    struct pci_access *pci;
    struct pci_dev *dev;
    int i;

    pci = pci_alloc();
    pci_init(pci);

    pci_scan_bus(pci);

    for(dev = pci->devices; dev; dev = dev->next) 
    {
        pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_CLASS | PCI_FILL_IRQ | PCI_FILL_BASES | PCI_FILL_ROM_BASE | PCI_FILL_SIZES | PCI_FILL_PHYS_SLOT);
        if(dev->vendor_id == 0x1002 && dev->device_id == 0x6899)
        {
            //Vendor is AMD, Device ID is a AMD HD5850 GPU
            for(i = 0; i < 6; i++) 
            {
                printf("Region Size %d %x ID %x\n", dev->size[i], dev->base_addr[i], dev->device_id); …
Run Code Online (Sandbox Code Playgroud)

c windows size regions pci

8
推荐指数
1
解决办法
2750
查看次数

如何在Windows上的C语言中为双精度数添加千位分隔符?

我使用MPFR库对大数字进行计算,但也返回小数点后8位数字的双精度数。

我将数字mpfr_sprintf转换为char数组,以确保精度或任何功能都不会丢失。一切都很好,除了我在文档中没有找到任何千位分隔符选项(否则我错过了)。

给定一个诸如20043.95381376之类的数字,我希望将其表示为20,043.95381376,以提高可读性。

或数字164992818.48075795164,992,818.48075795

我读到有关应加到printf / sprintf中的撇号,但这似乎是UNIX / POSIX,并且我是Windows用户。

由于在内部我将数字打印为字符串,所以我认为我可以做的是编写一个自定义实现,该实现将根据数字自动添加逗号(> 1000> 10000> 100000,依此类推),但随后我意识到像strncpy这样的函数或strcpy将基本上替换,而不是将逗号添加到所需位置。这就是我回到如何做的第一件事。

我该怎么做?

c windows double separator

5
推荐指数
1
解决办法
2278
查看次数

如何获得每个进程的GPU使用率?

我有一个温度监控程序,我写了一会儿,监控我的AMD显卡上的温度和风扇,检查风扇故障或过热.它的问题在于,它需要事先知道哪个进程将使用GPU(图形处理单元),以便杀死它或优雅地使其停止以避免过热.

为了使我的程序更具动态性,我需要一种方法来查找哪个进程正在使用GPU,就像哪个进程正在使用CPU时间(任务管理器).一个这样的应用程序是来自SysInternals的Process Explorer.

我在问,我怎么能在Windows中用C做这个?我知道,如果有这样的方式,它将针对Vista及以上.

c windows gpu temperature

5
推荐指数
1
解决办法
2575
查看次数

为什么我在StartService上获得错误代码6?

出于我的目的,我需要为Windows编写内核模式驱动程序.目前我正在尝试使其在Windows 7 x64下运行.

我在Visual Studio 2012中创建了一个简单项目,其中包含KMDF驱动程序的默认代码.我通过测试签名编译了代码.驱动程序已编译并签名.我也启用了Test-Signing ON,清晰地显示在桌面的左下角.

在尝试启动驱动程序作为服务时,我总是得到一个错误代码6:无效句柄错误.(我已经简化了代码,只是尝试启动它但仍然无效;默认代码也不起作用)

基本上,我遇到的问题与这里提出的问题相同

/sf/ask/845611021/

不幸的是他从来没有回答过.我尝试了提供的解决方案,但它也没有帮助.

我试图启动驱动程序的代码是

int _cdecl main(void)
{
    HANDLE hSCManager;
    HANDLE hService;
    SERVICE_STATUS ss;

    hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);

    printf("Load Driver\n");

    if(hSCManager)
    {
        printf("Create Service\n");

        hService = CreateService(hSCManager, "Example", 
                             "Example Driver", 
                              SERVICE_ALL_ACCESS | SERVICE_START | DELETE | SERVICE_STOP , 
                              SERVICE_KERNEL_DRIVER,
                              SERVICE_DEMAND_START, 
                              SERVICE_ERROR_IGNORE, 
                              "\\path\\to\\driver\\KMDFDriver1.sys", 
                              NULL, NULL, NULL, NULL, NULL);

        if(!hService)
        {
            hService = OpenService(hSCManager, "Example", 
                   SERVICE_ALL_ACCESS | SERVICE_START | DELETE | SERVICE_STOP);

            if(!hService)
            {
                // If initial startup of the driver failed, it …
Run Code Online (Sandbox Code Playgroud)

c windows winapi wdk

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

无法在Java中输出正确的哈希值.怎么了?

在我的Android应用程序中,我有一个SHA256哈希值,我必须使用RIPEMD160消息摘要算法进一步散列.

我可以输出任何字符串的正确sha256和ripemd160哈希,但是当我尝试使用ripemd160散列sha256哈希时,我得到一个不正确的哈希值.

根据在线哈希计算器,字符串'test'(全部小写)的SHA256值为:

9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
Run Code Online (Sandbox Code Playgroud)

字符串'test'的RIPEMD160值为:

5e52fee47e6b070565f74372468cdc699de89107
Run Code Online (Sandbox Code Playgroud)

根据在线计算,使用ripemd160散列生成的sha256哈希的值为:

4efc1c36d3349189fb3486d2914f56e05d3e66f8
Run Code Online (Sandbox Code Playgroud)

而我的应用程序给我的是:

cebaa98c19807134434d107b0d3e5692a516ea66
Run Code Online (Sandbox Code Playgroud)

这显然是错的.

这是我的代码:

public static String toRIPEMD160(String in)
{
    byte[] addr = in.getBytes();
    byte[] out = new byte[20];
    RIPEMD160Digest digest = new RIPEMD160Digest();
    byte[] sha256 = sha256(addr);
    digest.update(sha256,0,sha256.length);
    digest.doFinal(out,0);
    return getHexString(out);
}

public static byte[] sha256(byte[] data)
{
    byte[] sha256 = new byte[32];
    try
    {
        sha256 = MessageDigest.getInstance("SHA-256").digest(data);
    }
    catch(NoSuchAlgorithmException e)
    {}

    return sha256;
}
Run Code Online (Sandbox Code Playgroud)

对于ripemd160算法,sha256需要bouncycastle和java.security.MessageDigest.

java android sha

4
推荐指数
1
解决办法
1422
查看次数

如何从OpenSSL中的ECDSA私钥获取公钥?

我提供此示例应用程序来显示我的问题

#include <stdio.h>
#include <stdlib.h>
#include <openssl/ec.h>
#include <openssl/bn.h>

int main()
{
     EC_KEY *pkey = NULL;
     EC_POINT *pub_key = NULL;
     const EC_GROUP *group = NULL;
     BIGNUM start;
     BIGNUM *res;
     BN_CTX *ctx;

     BN_init(&start);
     ctx = BN_CTX_new();

     res = &start;
     BN_hex2bn(&res,"3D79F601620A6D05DB7FED883AB8BCD08A9101B166BC60166869DA5FC08D936E");
     pkey = EC_KEY_new_by_curve_name(NID_secp256k1);
     group = EC_KEY_get0_group(pkey);
     pub_key = EC_POINT_new(group);

     EC_KEY_set_private_key(pkey, res);

     assert(EC_POINT_bn2point(group,res, pub_key, ctx)); // Null here

     EC_KEY_set_public_key(pkey, pub_key);


    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是从私钥显示公钥(应该是椭圆私钥).在遇到类似的问题之前,我不知道怎么做

如何提供OpenSSL随机数据以用于ECDSA签名?

这是我从哪里指出自己如何获取公钥并使用EC_POINT_bn2point而不是根据OpenSSL源在内部执行BN_hex2bn的hex2point.

那么,为什么EC_POINT_bn2point返回NULL?我正在认真考虑重新编译OpenSSL并调试一些调试例程以找出失败的原因.

openssl cryptography elliptic-curve public-key-encryption

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

我如何预先计算calloc将分配多少内存?

我基本上有这段代码.

char (* text)[1][80];
text = calloc(2821522,80);
Run Code Online (Sandbox Code Playgroud)

我计算它的方式,calloc应该分配215.265045兆字节的RAM,但是,程序最终超过了这个数字并分配了近700mb的内存.

所以看来我无法正确知道该功能将分配多少内存.

如何计算这个属性?

c calloc

0
推荐指数
1
解决办法
533
查看次数