【问题标题】:Parse a file of hex and split it up into 6-bit ints解析十六进制文件并将其拆分为 6 位整数
【发布时间】:2015-07-23 22:43:10
【问题描述】:

我有一个包含十六进制代码的file

 01F640
 01E120
 04EF20
 000000

我想将每 6 位添加到一个数组中。该数组将它们存储为整数,以便程序的其余部分可以评估它们。 Here is the code I have so far.

int main(int argc, const char *argv[]){
   if(argc < 1){
     printf("You need to specify a file!");
     exit(EXIT_FAILURE);
   }
   char ch;
   char chars[6];
   int charCount = 0;
   FILE *f;
   f = fopen(argv[1], "r");
   int i = 0, j = 0;
   while((ch = fgetc(f)) != EOF){
     if(ch == '\n') continue;
     printf("r%X", ch);
     printf("\n");
     chars[i] = (char)ch;
     i++;
     if(i <= 6){
       i = 0;
       int hex[6];
       int m;
       for(m = 0; m < 6; m++){
         printf("\ns%X", chars[m]);
         char buffer[1];
         buffer[0] = chars[m];
         hex[m] = (int) strtol(buffer, NULL, 16);
       }
       unsigned int k = (hex[0]<<40)|(hex[1]<<32)|(hex[2]<<24)|(hex[3]<<16)|(hex[4]<<8)|hex[5];
       prog[j++] = k;
       memset(&chars[0], 0, sizeof(chars));
     }
   }

   int l;
   for(l = 0; l < PROG_LENGTH; l++){
     printf("p%X", prog[l]);
     if(prog[l] == 0) break;
   }
 }

我要做的是读取每个字符并将其添加到字符数组中。一旦该数组达到 6,从这些位中创建一个 int 并重置数组。

Here are some recent builds from Travis.

【问题讨论】:

  • 您应该直接在问题中编辑您的代码和任何其他文档,例如您的输入示例。外部链接坏了。您还应该解释您的代码遇到的具体问题。您的描述说明了您正在尝试做什么,但没有说明什么不起作用。
  • @RetiredNinja 刚刚添加了外部代码,我不知道它出了什么问题! :P 我会尝试更多的调试,看看出了什么问题。
  • 六个十六进制数字大于六位。它是三个字节。
  • 您为什么不直接读取整行并使用strtol 将其转换为整数?理想情况下,您的示例中应该包含一些十六进制字符,以清楚地表明它们不仅仅是 6 位基数为 10 的整数。
  • @EOF 我的意思是十六进制数字的六个“数字”。我找不到它的好名字。

标签: c arrays hex


【解决方案1】:

您可以将字符读入缓冲区,然后使用 strtol

int i = 0, j = 0;
char buffer[7];
buffer[6] = '\0';
while((ch = fgetc(f)) != EOF){
   if(ch == '\n') continue;
   buffer[i++] = ch;
   if(i == 6) {
      i = 0;
      prog[j++] = (int)strtol(buffer, NULL, 16);
   }
}

【讨论】:

  • fgets()。不要让它变得比它必须的更难。
  • 但是 fgets 会让忽略换行变得困难。
  • 不,你只需要使缓冲区足够大。对于使用多个字符表示换行符(\r\n\n\r)的环境,您的 解决方案会失败。​​
猜你喜欢
  • 2020-09-11
  • 1970-01-01
  • 2012-05-28
  • 2011-04-08
  • 2023-03-25
  • 2021-10-03
  • 2017-12-02
  • 2022-11-16
  • 1970-01-01
相关资源
最近更新 更多