【问题标题】:To generate hexadecimal numbers for 1000 bytes in C在 C 中生成 1000 个字节的十六进制数
【发布时间】:2010-08-09 14:07:24
【问题描述】:

我想在 C 中生成从种子值(初始值)0706050403020100 开始的十六进制数字。我的下一个数字应该是 0f0e0d0c0b0a0908 等等,以进行下一次迭代。
这样,我想生成 1000 字节的数字。

1)我怎样才能生成这些十六进制数字。

2)如果我想将生成/生成的十六进制数字逐个字符与缓冲区(动态)中的可用数据进行比较,该缓冲区具有读取文件的内容,如何存储这些数字。

  Any suggestions/answers are most welcome as i am still learning C language.

编辑:这是我尝试过的代码。

#include<stdio.h>
#include<stdlib.h>

int main(){
  FILE *fp;
  char *buffer, c;
  size_t filesize, result;
  int i, expected_data[];

  fp = fopen("hex_data", "r");
  if (fp == NULL) {  
    fputs("Error\n", stderr);
    exit(1);
  }
  fseek(fp, 0L, SEEK_END);
  filesize = ftell(fp);
  printf("Size of hex_data file is:%u \n", filesize); 
  fseek(fp,0L,SEEK_SET); 
  buffer = (char*) malloc(sizeof(char)*filesize);

  if(buffer == NULL){
    fputs("\nMemory error ", stderr);
  }
  buffer_size = fread(buffer, sizeof(char), size, fp);
  for(i=0; i < result; i++) {
    printf("%c",*(buffer +i));
  }
  printf("No of elements read from file are:%u \n", buffer_size); 

  fseek(fp,0L,SEEK_SET);
  int current_pos = 0;
  while(current_pos < buffer_size) {
    if (buffer[current_pos] != expected_data) {
      fputs("Error\n",stderr);
    }
    else {
      current_pos++;
      expected_data = next_exp_data(data); //function is call hexadecimal numbers produced
    }
  }

在这里,我想编写一个函数来生成从 0706050403020100 开始的 1000 个字节的十六进制数字。如果这是每次的初始数据,如果我将 08 添加到每个字节,我应该得到下一个数字(直到 1000 个字节)。但我不不知道怎么做。谁能帮帮我。

欢迎对代码进行任何更正。

【问题讨论】:

  • 你能提供更多关于如何生成数字的信息吗?它们应该是随机的,还是有一些将0706050403020100 链接到0f0e0d0c0b0a0908 的模式?也许即使你告诉我们序列中接下来的几个数字应该是什么,我们也能理解你的意思。
  • 没有数字不是随机的。它是一个顺序数据。如果 0706050403020100 是初始值,下一个数字应该是接下来的八个十六进制数字,依此类推。或者如果 76543210 是数字,接下来的八个十六进制数字是为下一次迭代生成。
  • 我不清楚您所说的“接下来的八个十六进制数字”是什么意思;所示代码从文件中读取字节。
  • 对不起代码。是的,代码确实从文件中读取字节。我想用 C 编写一个应用程序,它读取具有 1000 字节顺序数据的文件的内容。我想比较相同的数据在我的应用程序中检查它是否正确。我的初始值(种子)是 x0706050403020100(十六进制)(64 位)。我想检查 1000 个字节。

标签: c


【解决方案1】:

这将生成 1000 字节的随机十六进制数。 (或者更确切地说,1000 个十六进制数字的 ASCII 表示。)

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    int i;
    for (i=0; i<1000; i++) {
        printf("%x", rand()%16);
    }
    printf("\n");
    return EXIT_SUCCESS;
}

如果您想将它们存储在缓冲区中以便稍后与其他内容进行比较,您可能需要查看sprintf 而不是printf。为此,您确实需要首先了解字符串在 C 中是如何分配和使用的。

编辑:这可能是您所追求的。它从标准输入中读取十六进制数字(如果需要,可以从文件中重定向)并检查它们是否遵循您描述的模式。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    int expected_number = 7;
    unsigned int read_number;
    while (1 == scanf("%2x", &read_number)) {
        if (expected_number != read_number) {
            fprintf(stderr, "Expected %02x but got %02x.\n", expected_number, read_number);
        }
        expected_number--;
        if (expected_number == -1) expected_number = 15;
    }
    return EXIT_SUCCESS;
}

【讨论】:

  • 感谢您的输入 David。但我想生成连续的十六进制数字,以便它继续生成接下来的八个数字等等。
  • 哦,好的,我明白了。在这种情况下,您可能根本不需要生成它们。如果您要将它们与现有数据进行比较,只需读入现有数据(使用scanf("%2x", &amp;inputNumber); 或类似的东西),每次读取一对新的十六进制数字时,将它们与从 15 减少到的 int 计数器进行比较,直到它下降到 0,然后又回到 15。请参阅我上面的编辑以获取一些可能有帮助的代码。
  • 感谢您的回答。但我想用 C 语言编写一个应用程序,它读取具有 1000 字节顺序数据的文件的内容。我想在我的应用程序中比较相同的数据并检查它是否是正确与否。我的初始值(种子)是 x0706050403020100(十六进制)(64 位)。我想检查 1000 个字节。
  • @Thej:除非我误解了你,否则代码就是这样做的。如果您需要更多帮助,那么您需要解释当前提供的解决方案有什么问题。
  • 非常感谢。我不是那个意思。我不习惯在 C 中使用命令行参数。所以我很难理解你在做什么。永远感谢你的代码。跨度>
【解决方案2】:

您的数字很大,因此请使用 64 位无符号整数数据类型,例如 unsigned long long。如果不采用新方案,您将无法处理大于2**64 的数字。使用printf("%x", value) 打印十六进制值。

您可以查看 GNU GMP 库以获得任意大的整数。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 2011-11-17
    • 2015-08-08
    • 2010-11-06
    • 2017-09-13
    • 2012-01-24
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多