Übersetzen von Quellcode

darkeye2

Bekanntes Mitglied
Hallo,
übersetze grad einen C# quellcode in java, ist grundsätzlich nicht all zu kompliziert gewesen, und mir fehlen nur noch wenige pasagen, aber da brauche ich hilfe, da ich C# nicht wirklich kann und google auch nicht immer hilfreiche ergebnisse liefert, würde ich mich freuen, wenn mir hier jemand weiter helfen kann.
Hier das erste codesnipsel:
Code:
nt[,] table =    {    
                            {32000, 16000,  8000},
                            {    0,     0,     0}, 
                            {22050, 24000, 16000}, 
                            {44100, 48000, 32000}  
                        };

        return table[getVersionIndex(), getFrequencyIndex()];
getVersionIndex und getFrequencyIndex geben übrigens int werte zurück.

die zweite stelle, die ich net hinkrige ist:
Code:
 int[,,] table =        {
                                { // MPEG 2 & 2.5
                                    {0,  8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160,0}, // Layer III
                                    {0,  8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160,0}, // Layer II
                                    {0, 32, 48, 56, 64, 80, 96,112,128,144,160,176,192,224,256,0}  // Layer I
                                },
                                { // MPEG 1
                                    {0, 32, 40, 48, 56, 64, 80, 96,112,128,160,192,224,256,320,0}, // Layer III
                                    {0, 32, 48, 56, 64, 80, 96,112,128,160,192,224,256,320,384,0}, // Layer II
                                    {0, 32, 64, 96,128,160,192,224,256,288,320,352,384,416,448,0}  // Layer I
                                }
                                };

            return table[getVersionIndex() & 1, getLayerIndex()-1, getBitrateIndex()];

das problem scheint das gleiche zu sein, aber die leute, die C# können werden mir wohl helfen können.
 

darkeye2

Bekanntes Mitglied
danke, hat soweit funktioniert, jetzt muss ich noch fehler beseitigen, die scheinbar drin sind, und nicht von eclipse gleich erkannt werden^^.
Folgender code bringt mir einen error:
[JAVA=48]int intPos = 0;
do
{
fs.getChannel().position(intPos);
fs.getChannel().read(bytHeader,0,4);
intPos++;
LoadMP3Header(bytHeader);
}[/code]
fehler:
Code:
Exception in thread "main" java.lang.NullPointerException
	at sun.nio.ch.IOUtil.remaining(Unknown Source)
	at sun.nio.ch.IOUtil.read(Unknown Source)
	at sun.nio.ch.FileChannelImpl.read0(Unknown Source)
	at sun.nio.ch.FileChannelImpl.read(Unknown Source)
	at de.home.music.verwaltungV2.MP3Header.ReadMP3Information(MP3Header.java:52)
	at de.home.music.verwaltungV2.MP3Header.<init>(MP3Header.java:25)
	at de.home.music.verwaltungV2.Song.researchTag(Song.java:207)
	at de.home.music.verwaltungV2.Song.<init>(Song.java:40)
	at de.home.music.verwaltungV2.Test.main(Test.java:11)
 

Murray

Top Contributor
Das ist ein Laufzeitfehler; den kann Eclipse nicht anhand der Quelltexte finden, da er ja erst zur Laufzeit auftritt.

Konkret ist hier offenbar die Variable bytHeader null; erwartet würde eine Referenz auf ein byte[].
 

darkeye2

Bekanntes Mitglied
bytHeader ist bei mir ein ByteBuffer:
ByteBuffer[] bytHeader = new ByteBuffer[4];
und ja ... da ist nix drin, aber soweit ich weiß sollen da ja die daten hingespeicher werden.
 

darkeye2

Bekanntes Mitglied
keiner eine idee, wo hier der fehler liegt?
nochmal der code:
[JAVA=33] FileInputStream fs = new FileInputStream(FileNam);
// Set the filename not including the path information
FileName = FileNam;
String chrSeparators = new String("\\\\");
String[] strSeparator = FileName.split(chrSeparators);
int intUpper = strSeparator.length -1;
FileName = strSeparator[intUpper];

// Set the file size
FileSize = fs.getChannel().size();

ByteBuffer[] bytHeader = new ByteBuffer[4];
ByteBuffer[] bytVBitRate = new ByteBuffer[12];
int intPos = 0;

// Keep reading 4 bytes from the header until we know for sure that in
// fact it's an MP3
do
{
fs.getChannel().position(intPos);
fs.getChannel().read(bytHeader,0,4);
intPos++;
LoadMP3Header(bytHeader);
}
while(!IsValidHeader() && (fs.getChannel().position()!=fs.getChannel().size()));[/code]

kriege folgende Exception:
Code:
Exception in thread "main" java.lang.NullPointerException
	at sun.nio.ch.IOUtil.remaining(Unknown Source)
	at sun.nio.ch.IOUtil.read(Unknown Source)
	at sun.nio.ch.FileChannelImpl.read0(Unknown Source)
	at sun.nio.ch.FileChannelImpl.read(Unknown Source)
	at de.home.music.verwaltungV2.MP3Header.ReadMP3Information(MP3Header.java:53)
	at de.home.music.verwaltungV2.MP3Header.<init>(MP3Header.java:25)
	at de.home.music.verwaltungV2.Song.researchTag(Song.java:207)
	at de.home.music.verwaltungV2.Song.<init>(Song.java:40)
	at de.home.music.verwaltungV2.Test.main(Test.java:11)
 
S

SlaterB

Gast
dass die ByteBuffer nicht null sein dürfen willst du nicht als Möglichkeit akzeptieren und ausprobieren?
wobei das auch eine ziemlich komplizierte Methode ist, warum mehrere ByteBuffer füllen und nicht nur einen?

nach
ScatteringByteChannel (Java 2 Platform SE 5.0)
An invocation of this method attempts to read up to r bytes from this channel, where r is the total number of bytes remaining the specified subsequence of the given buffer array, that is,

dsts[offset].remaining()
+ dsts[offset+1].remaining()
+ ... + dsts[offset+length-1].remaining()

at the moment that this method is invoked.
scheinen die jedenfalls nicht null sein zu dürfen, wie sollte die Methode auch selber einen Buffer anlegen,
von welcher Größe? 1, 1000 oder 1 Mio. Bytes?
 

darkeye2

Bekanntes Mitglied
.... hmm, ich glaub ich hab irgendwas übrsehen, so sieht der ursprüngliche C# code aus, denn ich versuche zu übersetzen:
(in C# funktioniert auch alles super)
Code:
public class MP3Header
{
    // Public variables for storing the information about the MP3
    public int intBitRate;
    public string strFileName;
    public long lngFileSize;
    public int intFrequency;
    public string strMode;
    public int intLength;
    public string strLengthFormatted;

    // Private variables used in the process of reading in the MP3 files
    private ulong bithdr;
    private bool boolVBitRate;
    private int intVFrames;

    public bool ReadMP3Information(string FileName)
    {
        FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read);
        // Set the filename not including the path information
        strFileName = @fs.Name;
        char[] chrSeparators = new char[] { '\\', '/' };
        string[] strSeparator = strFileName.Split(chrSeparators);
        int intUpper = strSeparator.GetUpperBound(0);
        strFileName = strSeparator[intUpper];

        // Replace ' with '' for the SQL INSERT statement
        strFileName = strFileName.Replace("'", "''");

        // Set the file size
        lngFileSize = fs.Length;

        byte[] bytHeader = new byte[4];
        byte[] bytVBitRate = new byte[12];
        int intPos = 0;

        // Keep reading 4 bytes from the header until we know for sure that in 
        // fact it's an MP3
        do
        {
            fs.Position = intPos;
            fs.Read(bytHeader, 0, 4);
            intPos++;
            LoadMP3Header(bytHeader);
        }
        while (!IsValidHeader() && (fs.Position != fs.Length));

        // If the current file stream position is equal to the length, 
        // that means that we've read the entire file and it's not a valid MP3 file
        if (fs.Position != fs.Length)
        {
            intPos += 3;

            if (getVersionIndex() == 3)    // MPEG Version 1
            {
                if (getModeIndex() == 3)    // Single Channel
                {
                    intPos += 17;
                }
                else
                {
                    intPos += 32;
                }
            }
            else                        // MPEG Version 2.0 or 2.5
            {
                if (getModeIndex() == 3)    // Single Channel
                {
                    intPos += 9;
                }
                else
                {
                    intPos += 17;
                }
            }

            // Check to see if the MP3 has a variable bitrate
            fs.Position = intPos;
            fs.Read(bytVBitRate, 0, 12);
            boolVBitRate = LoadVBRHeader(bytVBitRate);

            // Once the file's read in, then assign the properties of the file to the public variables
            intBitRate = getBitrate();
            intFrequency = getFrequency();
            strMode = getMode();
            intLength = getLengthInSeconds();
            strLengthFormatted = getFormattedLength();
            fs.Close();
            return true;
        }
        return false;
    }

    private void LoadMP3Header(byte[] c)
    {
        // this thing is quite interesting, it works like the following
        // c[0] = 00000011
        // c[1] = 00001100
        // c[2] = 00110000
        // c[3] = 11000000
        // the operator << means that we'll move the bits in that direction
        // 00000011 << 24 = 00000011000000000000000000000000
        // 00001100 << 16 =         000011000000000000000000
        // 00110000 << 24 =                 0011000000000000
        // 11000000       =                         11000000
        //                +_________________________________
        //                  00000011000011000011000011000000
        bithdr = (ulong)(((c[0] & 255) << 24) | ((c[1] & 255) << 16) | ((c[2] & 255) << 8) | ((c[3] & 255)));
    }

    private bool LoadVBRHeader(byte[] inputheader)
    {
        // If it's a variable bitrate MP3, the first 4 bytes will read 'Xing'
        // since they're the ones who added variable bitrate-edness to MP3s
        if (inputheader[0] == 88 && inputheader[1] == 105 &&
            inputheader[2] == 110 && inputheader[3] == 103)
        {
            int flags = (int)(((inputheader[4] & 255) << 24) | ((inputheader[5] & 255) << 16) | ((inputheader[6] & 255) << 8) | ((inputheader[7] & 255)));
            if ((flags & 0x0001) == 1)
            {
                intVFrames = (int)(((inputheader[8] & 255) << 24) | ((inputheader[9] & 255) << 16) | ((inputheader[10] & 255) << 8) | ((inputheader[11] & 255)));
                return true;
            }
            else
            {
                intVFrames = -1;
                return true;
            }
        }
        return false;
    }

    private bool IsValidHeader()
    {
        return (((getFrameSync() & 2047) == 2047) &&
                ((getVersionIndex() & 3) != 1) &&
                ((getLayerIndex() & 3) != 0) &&
                ((getBitrateIndex() & 15) != 0) &&
                ((getBitrateIndex() & 15) != 15) &&
                ((getFrequencyIndex() & 3) != 3) &&
                ((getEmphasisIndex() & 3) != 2));
    }

    private int getFrameSync()
    {
        return (int)((bithdr >> 21) & 2047);
    }

    private int getVersionIndex()
    {
        return (int)((bithdr >> 19) & 3);
    }

    private int getLayerIndex()
    {
        return (int)((bithdr >> 17) & 3);
    }

    private int getProtectionBit()
    {
        return (int)((bithdr >> 16) & 1);
    }

    private int getBitrateIndex()
    {
        return (int)((bithdr >> 12) & 15);
    }

    private int getFrequencyIndex()
    {
        return (int)((bithdr >> 10) & 3);
    }

    private int getPaddingBit()
    {
        return (int)((bithdr >> 9) & 1);
    }

    private int getPrivateBit()
    {
        return (int)((bithdr >> 8) & 1);
    }

    private int getModeIndex()
    {
        return (int)((bithdr >> 6) & 3);
    }

    private int getModeExtIndex()
    {
        return (int)((bithdr >> 4) & 3);
    }

    private int getCoprightBit()
    {
        return (int)((bithdr >> 3) & 1);
    }

    private int getOrginalBit()
    {
        return (int)((bithdr >> 2) & 1);
    }

    private int getEmphasisIndex()
    {
        return (int)(bithdr & 3);
    }

    private double getVersion()
    {
        double[] table = { 2.5, 0.0, 2.0, 1.0 };
        return table[getVersionIndex()];
    }

    private int getLayer()
    {
        return (int)(4 - getLayerIndex());
    }

    private int getBitrate()
    {
        // If the file has a variable bitrate, then we return an integer average bitrate,
        // otherwise, we use a lookup table to return the bitrate
        if (boolVBitRate)
        {
            double medFrameSize = (double)lngFileSize / (double)getNumberOfFrames();
            return (int)((medFrameSize * (double)getFrequency()) / (1000.0 * ((getLayerIndex() == 3) ? 12.0 : 144.0)));
        }
        else
        {
            int[, ,] table =        {
                                { // MPEG 2 & 2.5
                                    {0,  8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160,0}, // Layer III
                                    {0,  8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160,0}, // Layer II
                                    {0, 32, 48, 56, 64, 80, 96,112,128,144,160,176,192,224,256,0}  // Layer I
                                },
                                { // MPEG 1
                                    {0, 32, 40, 48, 56, 64, 80, 96,112,128,160,192,224,256,320,0}, // Layer III
                                    {0, 32, 48, 56, 64, 80, 96,112,128,160,192,224,256,320,384,0}, // Layer II
                                    {0, 32, 64, 96,128,160,192,224,256,288,320,352,384,416,448,0}  // Layer I
                                }
                                };

            return table[getVersionIndex() & 1, getLayerIndex() - 1, getBitrateIndex()];
        }
    }

    private int getFrequency()
    {
        int[,] table =    {    
                            {32000, 16000,  8000}, // MPEG 2.5
                            {    0,     0,     0}, // reserved
                            {22050, 24000, 16000}, // MPEG 2
                            {44100, 48000, 32000}  // MPEG 1
                        };

        return table[getVersionIndex(), getFrequencyIndex()];
    }

    private string getMode()
    {
        switch (getModeIndex())
        {
            default:
                return "Stereo";
            case 1:
                return "Joint Stereo";
            case 2:
                return "Dual Channel";
            case 3:
                return "Single Channel";
        }
    }

    private int getLengthInSeconds()
    {
        // "intKilBitFileSize" made by dividing by 1000 in order to match the "Kilobits/second"
        int intKiloBitFileSize = (int)((8 * lngFileSize) / 1000);
        return (int)(intKiloBitFileSize / getBitrate());
    }

    private string getFormattedLength()
    {
        // Complete number of seconds
        int s = getLengthInSeconds();

        // Seconds to display
        int ss = s % 60;

        // Complete number of minutes
        int m = (s - ss) / 60;

        // Minutes to display
        int mm = m % 60;

        // Complete number of hours
        int h = (m - mm) / 60;

        // Make "hh:mm:ss"
        return h.ToString("D2") + ":" + mm.ToString("D2") + ":" + ss.ToString("D2");
    }

    private int getNumberOfFrames()
    {
        // Again, the number of MPEG frames is dependant on whether it's a variable bitrate MP3 or not
        if (!boolVBitRate)
        {
            double medFrameSize = (double)(((getLayerIndex() == 3) ? 12 : 144) * ((1000.0 * (float)getBitrate()) / (float)getFrequency()));
            return (int)(lngFileSize / medFrameSize);
        }
        else
            return intVFrames;
    }

}

meine übersetzung sieht wie folgt aus, wirft keinen fehler, aber gibt auch kein ergebniss ....
Java:
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;

public class MP3Header {
	
    // Public variables für die infos
    private int BitRate;
    private String FileName;
    private long FileSize;
    private int Frequency;
    private String Mode;
    private int Length;
    private String LengthFormatted;
    
    // Private variables zum zwischenspeichern
    private long bithdr;
    private boolean VBitRate;
    private int VFrames;
    
    MP3Header(String path){
    	try {
			ReadMP3Information(path);

		} catch (IOException e) {
			e.printStackTrace();
		}
    }
    
    public boolean ReadMP3Information(String FileNam) throws IOException{
    	FileInputStream fs = new FileInputStream(FileNam);
        // Set the filename not including the path information
        FileName = FileNam;
        String chrSeparators = new String("\\\\");
        String[] strSeparator = FileName.split(chrSeparators);
        int intUpper = strSeparator.length -1;
        FileName = strSeparator[intUpper];
        
        // Set the file size
        FileSize = fs.getChannel().size();

        ByteBuffer[] bytHeader = new ByteBuffer[4];
        bytHeader[0] = ByteBuffer.allocate(1);
        bytHeader[1] = ByteBuffer.allocate(1);
        bytHeader[2] = ByteBuffer.allocate(1);
        bytHeader[3] = ByteBuffer.allocate(1);
        ByteBuffer[] bytVBitRate = new ByteBuffer[12];
        int intPos = 0;
        
        // Keep reading 4 bytes from the header until we know for sure that in 
        // fact it's an MP3
        do
        {
            fs.getChannel().position(intPos);
            fs.getChannel().read(bytHeader,0,4);
            intPos++;
            LoadMP3Header(bytHeader);
        }
        while(!IsValidHeader() && (fs.getChannel().position()!=fs.getChannel().size()));
        
        // prüfen ob länge gleich aktuelle position
        if(fs.getChannel().position() != fs.getChannel().size())
        {
            intPos += 3;

            if(getVersionIndex() == 3)    // MPEG Version 1
            {
                if(getModeIndex() == 3)    // Single Channel
                {
                    intPos += 17;
                }
                else
                {
                    intPos += 32;
                }
            }
            else                        // MPEG Version 2.0 or 2.5
            {
                if(getModeIndex() == 3)    // Single Channel
                {
                    intPos += 9;
                }
                else
                {
                    intPos += 17;
                }
            }
            
            // Check to see if the MP3 has a variable bitrate
            fs.getChannel().position(intPos);
            fs.getChannel().read(bytVBitRate,0,12);
            VBitRate = LoadVBRHeader(bytVBitRate);

            // Once the file's read in, then assign the properties of the file to the public variables
            BitRate = getBitrate();
            Frequency = getFrequency();
            Mode = getMode();
            Length = getLengthInSeconds();
            LengthFormatted = getFormattedLength();
            fs.close();
            return true;
        }
        return false;

    }


    private void LoadMP3Header(ByteBuffer[] bytHeader)
    {
        // this thing is quite interesting, it works like the following
        // c[0] = 00000011
        // c[1] = 00001100
        // c[2] = 00110000
        // c[3] = 11000000
        // the operator << means that we'll move the bits in that direction
        // 00000011 << 24 = 00000011000000000000000000000000
        // 00001100 << 16 =         000011000000000000000000
        // 00110000 << 24 =                 0011000000000000
        // 11000000       =                         11000000
        //                +_________________________________
        //                  00000011000011000011000011000000
        bithdr = (long)(((bytHeader[0].get(0) & 255) << 24) | ((bytHeader[1].get(0) & 255) << 16) | ((bytHeader[2].get(0) & 255) <<  8) | ((bytHeader[3].get(0) & 255))); 
    }

    private boolean LoadVBRHeader(ByteBuffer[] inputheader)
    {
        // If it's a variable bitrate MP3, the first 4 bytes will read 'Xing'
        // since they're the ones who added variable bitrate-edness to MP3s
        if(inputheader[0].get() == 88 && inputheader[1].get() == 105 && 
            inputheader[2].get() == 110 && inputheader[3].get() == 103)
        {
            int flags = (int)(((inputheader[4].get() & 255) << 24) | ((inputheader[5].get() & 255) << 16) | ((inputheader[6].get() & 255) <<  8) | ((inputheader[7].get() & 255)));
            if((flags & 0x0001) == 1)
            {
                VFrames = (int)(((inputheader[8].get() & 255) << 24) | ((inputheader[9].get() & 255) << 16) | ((inputheader[10].get() & 255) <<  8) | ((inputheader[11].get() & 255)));
                return true;
            }
            else
            {
                VFrames = -1;
                return true;
            }
        }
        return false;
    }


    private boolean IsValidHeader() 
    {
        return (((getFrameSync()      & 2047)==2047) &&
                ((getVersionIndex()   &    3)!=   1) &&
                ((getLayerIndex()     &    3)!=   0) && 
                ((getBitrateIndex()   &   15)!=   0) &&
                ((getBitrateIndex()   &   15)!=  15) &&
                ((getFrequencyIndex() &    3)!=   3) &&
                ((getEmphasisIndex()  &    3)!=   2)    );
    }

    private int getFrameSync()     
    {
        return (int)((bithdr>>21) & 2047); 
    }

    private int getVersionIndex()  
    { 
        return (int)((bithdr>>19) & 3);  
    }

    private int getLayerIndex()    
    { 
        return (int)((bithdr>>17) & 3);  
    }

    protected int getProtectionBit() 
    { 
        return (int)((bithdr>>16) & 1);  
    }

    private int getBitrateIndex()  
    { 
        return (int)((bithdr>>12) & 15); 
    }

    private int getFrequencyIndex()
    { 
        return (int)((bithdr>>10) & 3);  
    }

    protected int getPaddingBit()    
    { 
        return (int)((bithdr>>9) & 1);  
    }

    protected int getPrivateBit()    
    { 
        return (int)((bithdr>>8) & 1);  
    }

    private int getModeIndex()     
    { 
        return (int)((bithdr>>6) & 3);  
    }
    
    protected int getLenght(){
    	return Length;
    }
    
    protected String getHLenght(){
    	return  LengthFormatted;
    }

    protected int getModeExtIndex()  
    { 
        return (int)((bithdr>>4) & 3);  
    }

    protected int getCoprightBit()   
    { 
        return (int)((bithdr>>3) & 1);  
    }

    protected int getOrginalBit()    
    { 
        return (int)((bithdr>>2) & 1);  
    }
    
    protected int  getBitRate(){
    	return BitRate;
    }
    
    protected String getModel(){
    	return Mode;
    }
    
    protected int getFrequenc(){
    	return Frequency;
    }
    
    private int getEmphasisIndex() 
    { 
        return (int)(bithdr & 3);  
    }

    protected double getVersion() 
    {
        double[] table = {2.5, 0.0, 2.0, 1.0};
        return table[getVersionIndex()];
    }

    protected int getLayer() 
    {
        return (int)(4 - getLayerIndex());
    }

    private int getBitrate() 
    {
        // If the file has a variable bitrate, then we return an integer average bitrate,
        // otherwise, we use a lookup table to return the bitrate
        if(VBitRate)
        {
            double medFrameSize = (double)FileSize / (double)getNumberOfFrames();
            return (int)((medFrameSize * (double)getFrequency()) / (1000.0 * ((getLayerIndex()==3) ? 12.0 : 144.0)));
        }
        else
        {
            int[][][] table =        {
                                { // MPEG 2 & 2.5
                                    {0,  8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160,0}, // Layer III
                                    {0,  8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160,0}, // Layer II
                                    {0, 32, 48, 56, 64, 80, 96,112,128,144,160,176,192,224,256,0}  // Layer I
                                },
                                { // MPEG 1
                                    {0, 32, 40, 48, 56, 64, 80, 96,112,128,160,192,224,256,320,0}, // Layer III
                                    {0, 32, 48, 56, 64, 80, 96,112,128,160,192,224,256,320,384,0}, // Layer II
                                    {0, 32, 64, 96,128,160,192,224,256,288,320,352,384,416,448,0}  // Layer I
                                }
                                };

            return table[getVersionIndex() & 1][getLayerIndex()-1][getBitrateIndex()];
        }
    }

    private int getFrequency() 
    {
        int[][] table =    {    
                            {32000, 16000,  8000}, // MPEG 2.5
                            {    0,     0,     0}, // reserved
                            {22050, 24000, 16000}, // MPEG 2
                            {44100, 48000, 32000}  // MPEG 1
                        };

        return table[getVersionIndex()][getFrequencyIndex()];
    }

    private String getMode() 
    {
        switch(getModeIndex()) 
        {
            default:
                return "Stereo";
            case 1:
                return "Joint Stereo";
            case 2:
                return "Dual Channel";
            case 3:
                return "Single Channel";
        }
    }

    private int getLengthInSeconds() 
    {
        // "intKilBitFileSize" made by dividing by 1000 in order to match the "Kilobits/second"
        int intKiloBitFileSize = (int)((8 * FileSize) / 1000);
        return (int)(intKiloBitFileSize/getBitrate());
    }

    private String getFormattedLength() 
    {
        // Complete number of seconds
        int s  = getLengthInSeconds();

        // Seconds to display
        int ss = s%60;

        // Complete number of minutes
        int m  = (s-ss)/60;

        // Minutes to display
        int mm = m%60;

        // Complete number of hours
        int h = (m-mm)/60;

        // Make "hh:mm:ss"
        return Integer.toString(h)+ ":" + Integer.toString(mm) + ":" + Integer.toString(ss);
    }

    private int getNumberOfFrames() 
    {
        // Again, the number of MPEG frames is dependant on whether it's a variable bitrate MP3 or not
        if (!VBitRate) 
        {
            double medFrameSize = (double)(((getLayerIndex()==3) ? 12 : 144) *((1000.0 * (float)getBitrate())/(float)getFrequency()));
            return (int)(FileSize/medFrameSize);
        }
        else 
            return VFrames;
    }



}

wo liegt der Fehler? ... Die Klasse sollte den mp3 Header auslesen, in C# kriege ich auch alles problemlos raus, in java kommt kein fehler, und ist auch nix unterringelt in eclipse, gibt halt beim ausführen nix zurück.
 
S

SlaterB

Gast
ein möglicher langer Weg, dafür selber durchführbar und fast bei allen derartigen Problemen anwendbar:

hast du eine entsprechende Testdatei und kannst du das C#-Programm ausführen und ändern?
arbeite schrittweise, lies erstmal nur die benötigten bytes ein und gib sie in beiden Programmen aus,

lassen sie sich laden, werden sie gleich interpretiert? ein Byte kann von -128 bis 127 gehen oder von 0 bis 255,
was allerdings bei Bit-Methoden manchmal gar nicht so wichtig ist

als nächstes dann Schritt für Schritt verfolgen was die Programme machen,
in beiden wird eine Variable flags ausgerechnet, enthält die das gleiche?

irgendwann kommt Code wie
> ((getFrameSync() & 2047)==2047)
was ist da jeweils der Wert getFrameSync(), was kommt als Ergebnis des Vergleichts raus (true oder false)
usw., mühsam, aber zielführend
 

darkeye2

Bekanntes Mitglied
also in C# lässt sich alle problemlos ausführen, und ich erhalte das gewünschte ergebniss, wenn jemand mal ausprobieren will kann ich gerne eine exe kompilieren.
In Java kommt eine ganz lange zeit lang gar nix und danach eben für alle werte 0 oder für strings null. beim durchprobieren mit System.out.println(); hab ich festgestellt, das eigentlich alles bei mir false liefert, was mich irgendwie nicht weiter gebracht hat, das problem vermute ich in diesem bereich:
Java:
ByteBuffer[] bytHeader = new ByteBuffer[4];
        bytHeader[0] = ByteBuffer.allocate(1);
        bytHeader[1] = ByteBuffer.allocate(1);
        bytHeader[2] = ByteBuffer.allocate(1);
        bytHeader[3] = ByteBuffer.allocate(1);

         fs.getChannel().read(bytHeader,0,4);
das mit den ByteBuffer hab ich immer noch nicht richtig verstanden, und denke dass da auch der fehler liegt.
 
S

SlaterB

Gast
> das problem vermute ich in diesem bereich:

was gibt es da groß zu vermuten?
gib die 4 Bytes aus, sind sie
> if (inputheader[0] == 88 && inputheader[1] == 105 &&
> inputheader[2] == 110 && inputheader[3] == 103)

oder nicht, das ist doch klar zu entscheiden,
also dass false rauskommt hast du vielleicht schon, aber welche Werte sind es stattdessen exakt?

-------
vielleicht verwendest du lieber einen FileInputStream, dann kannst du auch in ein 'normales' byte[4] einlesen ohne ByteBuffer

Read file in byte array using FileInputStream | Java Examples - Java Program Sample Source Code
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Anna_x96 Robocode / Übersetzen Allgemeine Java-Themen 13
S Verwendet Programmiersprache aus Quellcode - Datei ermitteln Allgemeine Java-Themen 6
C Quellcode-Übersetzung englisch zu deutsch Allgemeine Java-Themen 9
D Suche Quellcode! Allgemeine Java-Themen 8
B Quellcode einer Java libary finden um zu copy & paste'n Allgemeine Java-Themen 5
G Quellcode wiederherstellen Allgemeine Java-Themen 28
B Quellcode lesen - Aussortieren Allgemeine Java-Themen 3
M Quellcode von Java-Methoden Allgemeine Java-Themen 9
U Swing Hilfe beim Quellcode für ein Codierungs-/Decodierungsprogramm Allgemeine Java-Themen 9
G Externer Quellcode Allgemeine Java-Themen 3
L Methoden "Schiffe versenken" Quellcode in Methoden umwandeln Allgemeine Java-Themen 6
T Android Webview Webpage Quellcode to string Allgemeine Java-Themen 0
B Quellcode für Zwischenprüfung Allgemeine Java-Themen 4
M Aus Javaprogramm .NET Quellcode kompileren Allgemeine Java-Themen 2
J XML Dokument Zeilenumbruch in den Quellcode einfügen Allgemeine Java-Themen 5
T ExceptionHandling mit bescheidenem Quellcode Allgemeine Java-Themen 14
I Methoden Quellcode auslesen (Refelction o.ä.) Allgemeine Java-Themen 5
H Zeilenumbruch in Quellcode Allgemeine Java-Themen 4
G Eingegeben Formeln in Quellcode einbetten?! Allgemeine Java-Themen 4
E Compiler-Fehler wie muss ich die entstandene Quellcode kompilieren?? Allgemeine Java-Themen 2
T Api in Quellcode laden Allgemeine Java-Themen 8
L Java Quellcode auf Windows 7 ausführen? Allgemeine Java-Themen 3
S jsr in Quellcode Allgemeine Java-Themen 4
M R250 Quellcode Allgemeine Java-Themen 2
J Quellcode aus .jar auslesen? Allgemeine Java-Themen 3
M JLapack Quellcode beifügen? Allgemeine Java-Themen 4
P Probleme mit wikipedia quellcode zur binären Suche Allgemeine Java-Themen 6
X Quellcode von nativen Funktionen Allgemeine Java-Themen 2
N Java Quellcode zu Syntaxbaum Allgemeine Java-Themen 3
M Wie in Eclipse Quellcode incl. Zeilennummern kopieren? Allgemeine Java-Themen 6
G SourceForge - Quellcode Allgemeine Java-Themen 15
V Quellcode auf "Güte" testen? Allgemeine Java-Themen 5
C Java Quellcode parsen Allgemeine Java-Themen 8
M Quellcode DriverManager Allgemeine Java-Themen 2
C Fehler im Quellcode. Suche in einem Baum Allgemeine Java-Themen 3
G Problem mit Quellcode, Eingabe wird nicht angezeigt --HELP-- Allgemeine Java-Themen 2
T Problem mit Quellcode Allgemeine Java-Themen 2
D Was haltet ihr von meinem Quellcode - JConsole? Allgemeine Java-Themen 2
Lazybone Java Quellcode sichern Allgemeine Java-Themen 9
P Fehler im Quellcode Allgemeine Java-Themen 8
J Viel Text mit " im Quellcode abspeichern Allgemeine Java-Themen 7
R Copyright-Notiz am Anfang jeder Quellcode-Datei? Allgemeine Java-Themen 5
R Problem mit Quellcode Allgemeine Java-Themen 2
M Events im Quellcode auslösen Allgemeine Java-Themen 4
J Java Quellcode Aufbereitung für Dokumentation Allgemeine Java-Themen 11
padde479 Organisation von Quellcode Allgemeine Java-Themen 6
F Quellcode von Java ansehen Allgemeine Java-Themen 4
S In einem HTML Quellcode gewünschten Abschnitt in Datei Save Allgemeine Java-Themen 9
R Java Quellcode zu exe Datei unsw. Allgemeine Java-Themen 5
G Quellcode inkludieren Allgemeine Java-Themen 3
J Quellcode aus JAVA Programmen Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben