在java中使用struct uint32

时间:2018-06-09 11:19:23

标签: java struct binary

我试着用Java读取uint32。 我做得很好

import React, { Component } from 'react';
import { Text, View, FlatList, StyleSheet, AppState } from 'react-native';

export default class App extends Component {
  state = {
    data: []
  }
  requestItems = () => {
    fetch('someurl').then((response) => response.json()).then((responseJSON) => this.setState({data: responseJSON.data}))
  }
  componentDidMount() {
    this.requestItems()
    AppState.addEventListener('change', this.requestItems);
  }
  componentWillUnmount() {
     AppState.removeEventListener('change', this.requestItems);
  }
  renderItem = ({item}) => <Text>{item.text}</Text>
  render() {
    if (this.state.data.lenght === 0) return <Text>{'Loading'}</Text>
    return (
      <View style={styles.container}>
        <FlatList data={this.state.data} renderItem={this.renderItem} keyExtractor={(item) => item.id} />
      </View>
    );
  }
}  

但是这个uint32有特殊的结构 在文档写

byte[] record=new byte[4];
bBuff.get(record,0,4);
recordData = ((record[3] & 0xFF) << 24) | ((record[2] & 0xFF) << 16) | ((record[1] & 0xFF) << 8) | (record[0] & 0xFF);

在C代码中。它有结构的结构。

TTTR record, structured as follows (MSBit at the left):
Reserved[1], Valid[1], Route[2], Data[12], TimeTag[16]
If Valid==1
then Data = Channel
else Data = Overflow[1], Reserved[8], Marker[3]

我在java中做了什么:

struct {
    unsigned TimeTag    :16;
    unsigned Channel    :12;
    unsigned Route      :2;
    unsigned Valid      :1;
    unsigned Reserved   :1; }  TTTRrecord;

但它看起来像是一种魔力。 一切正常但不完全正确。 但我得到1路而不是2路。 这就像第二条路线一样。 也许我对路线的位表示有一些问题。

1 个答案:

答案 0 :(得分:0)

您的代码不正确:ChannelRoute的位掩码已关闭。它应该如下所示:

timeTag  = (recordData >>  0) & 0xFFFF;
channel  = (recordData >> 16) & 0x0FFF;
route    = (recordData >> 28) & 0x0003;
valid    = (recordData >> 30) & 0x0001;
reserved = (recordData >> 31) & 0x0001;

&#34;幻数&#34;在右边称为位掩码。它在您想要保留的位中有1个,并且在您要清除的位中有0个。