我有一个Sparc处理器,它以32位的高字节顺序存储数据,还有一个Intel处理器,它存储低字节顺序的数据。如何将值20从Sparc处理器发送到小端?
我认为20是用十六进制的0x00000014表示的,所以小端的值应该是14000000。是这样做的,还是我弄错了?
发布于 2019-06-11 01:27:17
我认为20用十六进制的0x00000014表示
正确的
,所以小端的值将是14000000。是这样做的,还是我弄错了?
你必须更精确一些。大端/小端只涉及架构方面的内存访问,或者在处理大于一个字节的实体时进行串行通信(或存储)。因此,在小端机器上,如果该整数存储在内存中的地址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级别的传输,并且您需要使用它们,那么您必须注意体系结构的字节顺序。在这种情况下,您可以在一端交换In的字节,但通常认为字节传输更可移植。
请注意,如果您的传输是通过tcp/ip等标准网络完成的,则不必关心字节顺序。为了以网络字节顺序(这是高字节顺序)发送数据,驱动程序执行与上述代码类似的操作。
https://stackoverflow.com/questions/56530228
复制相似问题