首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将值20从大端处理器发送到小端处理器?

如何将值20从大端处理器发送到小端处理器?
EN

Stack Overflow用户
提问于 2019-06-11 00:33:46
回答 1查看 96关注 0票数 0

我有一个Sparc处理器,它以32位的高字节顺序存储数据,还有一个Intel处理器,它存储低字节顺序的数据。如何将值20从Sparc处理器发送到小端?

我认为20是用十六进制的0x00000014表示的,所以小端的值应该是14000000。是这样做的,还是我弄错了?

EN

回答 1

Stack Overflow用户

发布于 2019-06-11 01:27:17

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

正确的

,所以小端的值将是14000000。是这样做的,还是我弄错了?

你必须更精确一些。大端/小端只涉及架构方面的内存访问,或者在处理大于一个字节的实体时进行串行通信(或存储)。因此,在小端机器上,如果该整数存储在内存中的地址ad处,则在ad处写入字节14,并在ad+1处写入ad+2和ad+3字节0。在大端架构中,14为ad+3,其他字节为0。

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

在两个处理器中,如果你在字节级进行通信,代码是相同的。您需要通过掩码和移位来提取字节,并在接收器级别进行类似的重建。

代码语言:javascript
复制
// 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级别的传输,并且您需要使用它们,那么您必须注意体系结构的字节顺序。在这种情况下,您可以在一端交换In的字节,但通常认为字节传输更可移植。

请注意,如果您的传输是通过tcp/ip等标准网络完成的,则不必关心字节顺序。为了以网络字节顺序(这是高字节顺序)发送数据,驱动程序执行与上述代码类似的操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56530228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档