【问题标题】:how to typecast byte array to 8 byte-size integer [closed]如何将字节数组类型转换为 8 字节大小的整数 [关闭]
【发布时间】:2013-12-24 20:35:33
【问题描述】:

我被问到一个面试问题:给定一个 6 字节的输入,它来自一个大字节序的机器,请实现一个函数将它转换/类型转换为 8 个字节,假设我们不知道运行这个函数的机器的字节序.

问题的重点似乎是在测试我对字节序的理解,因为在这个问题之前我被问到我是否知道字节序。

我不知道如何回答这个问题。例如我需要先将 6 字节填充到 8 字节吗?如何?这是我的代码。这是正确的吗?

 bool isBigEndian(){
  int num = 1;
  char* b = (char*)(&num);
  return b ? false:true;
 }    
 long long* convert(char* arr[]){ //size is 6
   long long* res = (long long*)malloc(long long);//...check res is NULL...
   if (isBigEnian()){  
         for(int i = 0; i< 6; i++)
           memset(res, i+2, arr[i]);
   }
   else {
         for(int i = 0; i< 6; i++)
           memset(res, i+2, arr[6-1-i]);
   }
   return res; //assume caller will free res.
 }

更新:回答我的问题不清楚,我刚刚找到了一个链接:Convert Bytes to Int / uint in C 与类似的问题。根据我的理解,主机的字节序确实很重要。假设如果输入是:char array[] = {01,02,03,04,05,06},那么如果主机是小端,输出存储为00,00,06,05,04,03,02,01 , 如果是大端,输出将存储为 00,00,01,02,03,04,05,06,在这两种情况下,0000 都会在开头填充。

我现在有点明白了:在另一台机器上,假设有一个数字xyz = 010203040506,因为它是bigendian,01是MSB。所以它被存储为 char array = {01,02,03,04,05,06} 其中 01 具有最低地址。那么在这台机器上,如果机器也是大端的。它应该存储为 {00,00,01,02,03,04,05,06 } 其中 01 仍然是 MSB,因此它被转换为相同的数字 int_64 xyz2 = 0000010203040506。但如果机器是小端,它应该存储为 {00,00,06,05,04,03,02,01 } 其中 01 是 MSB 的最高地址,以便 int_32 xyz2 = 0000010203040506。

如果我的理解有误,请告诉我。谁能告诉我为什么不管什么字节序总是在开头填充 0000 ?如果这台机器是小端序的,不应该在最后填充吗,因为 00 是最符号字节?

【问题讨论】:

  • 要回答这个问题,您需要对从 6 字节“转换”为 8 字节的含义进行一些定义。
  • 另外,我没有合理的方法可以看出字节序无关紧要。
  • 也许问题的重点是看你是否会要求澄清或继续缺乏规范。
  • 听起来有点像base64编码。
  • convert 表示在给定字节序条件的情况下如何将 6 字节存储在 8 字节变量中。

标签: c memory


【解决方案1】:

在继续之前,您应该要求澄清。

这里的转换到底意味着什么?用0填充每个字符?用 0 为每个字符添加前缀?

我假设每个字符都应该以 0 为前缀。这是一个可能的解决方案:

#include <stdint.h>
#include <limits.h>
#define DATA_WIDTH 6

uint64_t convert(unsigned char data[]) {
    uint64_t res;
    int i;
    res = 0;
    for (i = 0; i < DATA_WIDTH; i++) {
        res = (res << CHAR_BIT) | data[i];
    }
    return res;
}

要将 0 附加到每个字符,我们可以改为在 for 中使用它:

res = (res << CHAR_BIT) | (data[i] << 2);

在面试中,您应该始终注意解决方案的局限性。此解决方案假定实现提供uint64_t 类型(C 标准不要求)。

输入是大端的这一事实很重要,因为它让您知道data[0] 对应于最高有效字节,并且它必须在您的结果中保持不变。无论目标机器的字节顺序如何,此解决方案都有效。

【讨论】:

    【解决方案2】:

    我不明白你为什么认为 malloc 是必要的。为什么不只是这样?

    long long convert(unsigned char data[]);
    {
      long long res;
      res = 0;
      for( int i=0;i < 6; ++i)
        res = (res << 8) + data[i];
    
      return res;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 2014-04-14
      • 2014-10-05
      • 2023-04-02
      相关资源
      最近更新 更多