`
wangyanlong0107
  • 浏览: 499672 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

Java中的Big(Little)-endian问题的一种解决方法

    博客分类:
  • java
 
阅读更多
http://blog.sina.com.cn/s/blog_d0bb1ceb0102v5gu.html
 
Java二进制文件中的所有东西都以big-endian形式存在,高字节优先,这有时被称为网络顺序。这是一个好的消息,意味着如果你只使用 Java。所有文件在所有平台(Mac,PC,Solaris等)上按同样的方式进行处理。可以自由地交换二进制数据,以电子形式在Internet上, 或在软盘上,而无需考虑endian问题。
 
    存在的问题是当你与那些不是使用Java编写的程序交换数据文件时,会存在一些问题。因为这些程序使用的是 little-endian顺序,通常是在PC上使用的C语言。有些平台内部使用big-endian字节顺序(Mac,IBM390);有些平台使用 little-endian字节顺序(Intel)。Java对用户隐瞒了endian问题。

解决方式可以采用:

 
重写提供输入文件的输出程序。它可以直接输出big-endian字节流DataOutputStream或者字符DataOutputSream格式。 
写一个独立的翻译程序,读和排列字节。可以用任何语言编写。
 
以字节形式读数据,并重新安排它们。
还有一种方式是自己编写函数进行数据格式的转化。
 
打开RandomAccessFile的源代码,发现数据处理的代码如下:
 
public final short readShort() throws IOException {  
     int ch1 = this.read();  
     int ch2 = this.read();  
     if ((ch1 | ch2) < 0)  
         throw new EOFException();  
     return (short)((ch1 << 8) (ch2 << 0))
  }
简单明了,一目了然,因此重写输入输出程序是最简单的方法。由于这里的readShort是final的,因此采用由RandomAccessFile派生的方法,建立的新类如下:
import java.io.*;
public class MyRandomAccessFile extends RandomAccessFile {
    public MyRandomAccessFile(String name, String mode) throws FileNotFoundException {
        super(name, mode);
    }
    public final short myReadShort() throws IOException {
        int ch1 = this.read();
        int ch2 = this.read();
        if ((ch1 | ch2) < 0) {
            throw new EOFException();
        }
        return (short) ((ch2 << 8) (ch1 << 0));
    }
    public final int myReadInt() throws IOException {
        int ch1 = this.read();
        int ch2 = this.read();
        int ch3 = this.read();
        int ch4 = this.read();
        if ((ch1 | ch2 | ch3 | ch4) < 0) {
            throw new EOFException();
        }
        return ((ch4 << 24) (ch3 << 16) (ch2 << 8) (ch1 << 0));
    }
}
就是把原来的代码拷贝出来,然后把移位的变量换一下,就能轻松搞定。
分享到:
评论

相关推荐

    大端(Big Endian)与小端(Little Endian)简介

    大端与小端表示法是计算机系统中数据存储的一种基本概念,理解它们之间的区别对于编程、系统设计以及网络通信等领域非常重要。通过本文的介绍,相信读者已经掌握了大端与小端的基本概念及其应用场景,这对于进一步...

    大端(Big_Endian)与小端(Little_Endian)简介

    在计算机科学领域,大端(Big Endian)与小端(Little Endian)指的是数据(特别是多字节整数)在内存中存储时的字节顺序。这两种表示方法主要应用于不同类型的计算机体系结构中,对软件开发尤其是跨平台编程具有...

    Big Endian & Little Endian.pdf

    本文旨在详细介绍两种常见的数据存储格式:Big Endian(大端模式)与Little Endian(小端模式),并探讨它们在实际应用中的重要性。 #### 二、基本概念 **Big Endian** 和 **Little Endian** 是指多字节数据(如...

    JAVA网络字节序转换1

    主要有两种字节序:Big-Endian(大端字节序)和 Little-Endian(小端字节序)。 1. **大端字节序(Big-Endian)**: 大端字节序是指数据的最高有效字节存储在最低地址。例如,4字节的数字0x01020304,在Big-Endian...

    一种在JavaApplet和MFC程序间交换数据的方法

    ### 一种在Java Applet和MFC程序间交换数据的方法 #### 1. 引言 随着互联网技术的发展,跨平台编程的需求日益增加。Java Applet作为一种能够在多种平台上轻松部署的应用程序,在早期的Web开发中得到了广泛应用。另...

    About-Endian.zip_Word for Word

    主要分为两种类型:大端序(Big-Endian)和小端序(Little-Endian)。在大端序中,最高位的字节存储在内存地址的低位,而最低位的字节存储在高位;相反,在小端序中,最低位的字节存储在内存的低位,最高位的字节...

    Java解决UTF-8的BOM问题

    BOM的主要作用是在数据传输或存储时标识文件或数据流的字符编码,尤其是区分大端序(Big-Endian)和小端序(Little-Endian)的UTF-16编码。 在Java中,当我们从UTF-8编码的文本文件读取内容时,如果文件开头带有BOM...

    有关pdfbox-1.3.1中Identity-H编码为乱码的解决方法

    这可能涉及到字节序的转换,因为Identity-H可以是Big-Endian或Little-Endian的。 4. **修复PDF文档**:如果PDF文档本身存在问题,如缺失或错误的ToUnicode CMap,可能需要手动修复或使用PDFBox提供的工具进行修复。...

    解析大端模式和小端模式

    在开发过程中,经常会遇到需要将一种字节序的数据转换为另一种字节序的情况。下面提供两个简单的宏定义,用于实现大端到小端的转换: ```c #define BigtoLittle16(A)((((uint16)(A)&0xff00)&gt;&gt;8)|\ (((uint16)(A)&0x...

    解决java和net之间SHA256withRSA签名问题

    3. **字节序处理**:Java使用Big-Endian字节序,而.NET使用Little-Endian。在处理签名和验证时,可能需要进行字节序转换。 4. **数据编码**:确保签名前的数据在两个环境中以相同的编码(如UTF-8)进行处理。 在...

    利用Java读取二进制文件实例详解

    本文详细介绍了利用Java读取二进制文件的相关知识点,包括读取二进制文件的必要性、实现方法、little-endian和big-endian的区别以及Java读取二进制文件的优点。通过学习这些知识点,开发者可以更好地理解Java读取二...

    SEGY数据文件读取解析程序

    2. **数据解析**:程序需要识别并处理SEGY文件中的二进制数据,这通常涉及到字节序的处理(Big-Endian或Little-Endian)和数据类型的转换。 3. **VTK集成**:利用VTK的类库,将解析出的地震数据转化为VTK兼容的数据...

    分解长整型数据 读取每一个字节的内容

    长整型是一种可以存储大整数值的数据类型,它在不同的编程语言中可能会有不同的表示方式,如32位或64位。在本文中,我们将深入探讨如何分解长整型数据并逐个读取其字节内容。 1. 长整型的数据结构: 在32位系统中...

    java全栈工程师-java io

    内存映射文件是一种高效的数据处理方式,它可以将文件或部分文件的内容映射到内存中,从而可以直接通过内存地址访问文件内容,提高了文件访问的速度。Java中通过`FileChannel`的`map()`方法实现内存映射文件。 ### ...

    求职-摩托罗拉笔试题型 (软件工程师)

    为了在这样的笔试中取得好成绩,求职者需要具备扎实的计算机科学基础,熟悉至少一种高级编程语言,理解计算机网络和操作系统原理,并具备良好的问题解决能力。此外,对于移动通信和硬件基础的理解也会对解决某些题目...

    气象云图数据解析代码之Java实现

    AWX格式是气象学中用于存储和传输气象图像数据的一种标准格式,它包含了丰富的气象信息,如温度、湿度、风速等。下面我们将深入探讨Java实现AWX文件解析的关键知识点。 首先,理解AWX文件结构至关重要。AWX文件通常...

    JAVA 音频文件PCM转WAV Utils类

    4. **数据转换**:虽然PCM和WAV都包含原始音频样本,但WAV文件需要特定的格式,如little-endian或big-endian。Utils类可能包含将PCM数据转换为适合WAV格式的函数。 5. **写入WAV文件**:完成上述步骤后,Utils类将...

    java解析JT808-2013版本0200位置信息上传

    0200是JT808协议中的一种消息类型,通常用于设备上报位置信息,包括经纬度、速度、方向等关键数据。在Java中,我们需要对这些二进制数据进行解析,转换为可读的JSON格式,以便进一步处理和存储。 在解析过程中,...

    Java和c++的Socket通信如何发送结构体

    字节序是指在内存中存储多字节数据的顺序,分为大端字节序(Big-Endian)和小端字节序(Little-Endian)。大多数网络通信采用大端字节序,也称为网络字节序。因此,当Java(使用小端字节序)和C++(可能使用大端或小...

    java中final类型等的应用

    - **定义**:UTF-16BE 是一种16位的Unicode转换格式(UCS-2),采用大端字节序(Big Endian)。 - **特点**: - 大端字节序意味着高位字节存储在较低的地址中。 - 在UTF-16BE中,“字节顺序标记”(Byte Order ...

Global site tag (gtag.js) - Google Analytics