2010-12-28 22 views

Respuesta

2

Un enfoque obvio sería utilizar la representación textual del número como formato de intercambio.

+0

@mekrizzy ya que ambos sistemas pueden convertir flotadores hacia y desde texto puede usar texto como su idioma común. –

3
// http://en.wikipedia.org/wiki/IBM_Floating_Point_Architecture 
// float2ibm(-118.625F) == 0xC276A000 
// 1 100 0010 0111 0110 1010 0000 0000 0000 
// IBM/370 single precision, 4 bytes 
// xxxx.xxxx xxxx.xxxx xxxx.xxxx xxxx.xxxx 
// s|-exp--| |--------fraction-----------| 
// (7)   (24) 
// value = (-1)**s * 16**(e - 64) * .f range = 5E-79 ... 7E+75 
static int float2ibm(float from) 
{ 
    byte[] bytes = BitConverter.GetBytes(from); 
    int fconv = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8)| bytes[0]; 

    if (fconv == 0) return 0; 
    int fmant = (0x007fffff & fconv) | 0x00800000; 
    int t = (int)((0x7f800000 & fconv) >> 23) - 126; 
    while (0 != (t & 0x3)) { ++t; fmant >>= 1; } 
    fconv = (int)(0x80000000 & fconv) | (((t >> 2) + 64) << 24) | fmant; 
    return fconv; // big endian order 
} 

I cambió una pieza de código llama float_to_ibm static void (int de [], int a [], int n, int endian) el código anterior se puede ejecutar correctamente en PC de es poco número de flotador endian. valor de retorno es el número de big endian ibm float pero se almacena en el tipo int.

+0

Esto realmente me salvó la vida, desearía poder recompensarte con 50 puntos de reputación a los dos a toda velocidad y Noam M, simplemente no encuentro cómo. Un aviso: en mi caso, tuve que leer los bytes de la int retornada en orden inverso para obtener la salida imprimible en el archivo codificado windows-1252 (little endian). Fue para SAS XPORT. –

0

Hace poco tuve que convertir un flotador en otro. Parece que el formato XDR usa un formato impar para sus flotantes. Entonces cuando se convierte de XDR a flotantes estándar, este código lo hizo.

#include <rpc/rpc.h> 

// Read in XDR float array, copy to standard float array 
// out array needs to be allocated before the function call 

bool convertFromXdrFloatArray(float *in, float *out, long size) 
{ 
    XDR xdrs; 
    xdrmem_create(&xdrs,(char *)in, size*sizeof(float), XDR_DECODE); 

    for(int i = 0; i < size; i++) 
    { 
     if(!xdr_float(&xdrs, out++)) { 
      fprintf(stderr,"%s:%d:ERROR:xdr_float\n",__FILE__,__LINE__); 
      exit(1); 
     } 
    } 
    xdr_destroy(&xdrs); 

    return true; 
} 
0

Usando primera respuesta añadí la siguiente que puede ser útil en algunos casos:

///

/// Converts an IEEE floating number to its string representation (4 or 8 ascii codes). 
    /// Useful for SAS XPORT files format. 
    /// </summary> 
    /// <param name="from_">IEEE number</param> 
    /// <param name="padTo8_">When true, output is 8 chars rather than 4</param> 
    /// <returns>Printable string according to hardware's endianness</returns> 
    public static string Float2IbmAsAsciiCodes(float from_, bool padTo8_ = true) 
    { 
     StringBuilder sb = new StringBuilder(); 
     string s; 
     byte[] bytes = BitConverter.GetBytes(Float2Ibm(from_)); // big endian order 

     if (BitConverter.IsLittleEndian) 
     { 
      // Revert bytes order 
      for (int i = 3; i > -1; i--) 
       sb.Append(Convert.ToChar(bytes[i])); 
      s = sb.ToString(); 
      if (padTo8_) 
       s = s.PadRight(8, '\0'); 
      return s; 
     } 
     else 
     { 
      for (int i = 0; i < 8; i++) 
       sb.Append(Convert.ToChar(bytes[i])); 
      s = sb.ToString(); 
      if (padTo8_) 
       s = s.PadRight(8, '\0'); 
      return s; 
     } 
    } 
Cuestiones relacionadas