如何将值20从大字节序处理器发送到小字节序处理器?

时间:2019-06-10 16:33:45

标签: bit endianness

我有一个Sparc处理器,它以32位大尾数存储数据,还有一个Intel处理器,它存储小尾数。如何将值20从Sparc处理器发送到Little Endian?

我想20用十六进制的0x00000014表示,所以little endian的值将是14000000。这是怎么做的还是我弄错了?

1 个答案:

答案 0 :(得分:0)

  

我认为20用十六进制的0x00000014表示

  

所以小尾数的值将是14000000。这是怎么做的还是我弄错了?

您必须更加精确。大/小尾数仅在使用大于一个字节的实体完成时才涉及用于体系结构方面的内存访问或串行通信(或存储)。因此,如果在字节序小的机器上将此int存储在地址 ad 的内存中,则将 ad 写入字节14,并将其写入 ad +1 , ad +2和 ad +3字节0。在大端字节体系结构上,14位于 ad +3处,其他字节位于0

但是在两个处理器中,当加载到寄存器中时,这些值都是相同的,并且以相同的方式进行操作。

在两个处理器中,如果您以字节级别进行通信,则代码为相同。您需要通过屏蔽和移位来提取字节,并在接收器级别上类似地进行重构。

// send an int in its consecutive bytes over a channel. Data is send little endian.
void send_int_to_channel_by_bytes_LSB_first(int ii) {
  // ii is an int and I do *not* want to know how it is stored in memory
  char cc, mask=0xff;
  for(int i=0; i<4; i++) {
    cc = (ii >> (i*8)) & mask ;
    send_byte_to_channel(cc);
  }
}

// Receives 4 bytes from a channel a returns the reconstructed int.
// Data is received little endian.
int rcv_int_from_channel_by_bytes_LSB_first() {
  unsigned char cc;
  int ii=0;
  for(int i=0; i<4; i++) {
    cc = rcv_byte_from_channel() ;
    ii |= cc << (i*8) ;
  }
  returns ii;
}

如果您出于某种原因更愿意先进行传输MSB,则只需反转循环for(int i=3; i>=0; i--)

请注意,这是由于字节级传输造成的,在这种情况下,即使您的发送和接收体系结构具有相同的字节序,也必须编写序列化代码。

唯一需要注意体系结构字节序的情况是,如果驱动程序或软件库提供int级别的传输,并且您需要使用它们。在这种情况下,您可以在一侧交换int的字节,但通常认为字节传输更方便携带。

请注意,如果您使用tcp / ip之类的标准网络进行传输,则不必担心字节序。为了按照网络字节顺序(大字节序)发送数据,驱动程序执行了与上述代码类似的操作。