我问了一个有关转换Comp字段的问题,我没有得到任何答案。

我希望堆栈跨流可以帮助我解决这个问题。

我成功地将Comp-3转换为十进制。我需要您的帮助,以任何高级编程语言将未包装的小数转换回Comp-3,但最好是在Java或C#.NET中。

有帮助吗?

解决方案

在包装的小数中,-123表示为x'123d'(最后一个nyble c,d或f为符号)。处理包装小数的最简单方法之一就是简单地将字节转换为十六进制字符串(或根据需要的VICE),然后使用普通的字符串操纵。这可能不是最有效的,但很容易实施。

因此,要将整数(值)转换为包装小数(注:注意:我尚未测试代码)

String sign = "c";
if (value < 0) {
    sign = "d";
    value = -1 * value;
}
String val = value + "d"

byte[] comp3Bytes = new BigInteger(val, 16).toByteArray();

以下是一些用于从Comp3转换/从Comp3转换的示例代码,以从一系列字节中检索包装的小数 http://record-editor.svn.sourceforge.net/viewvc/record-editor/source/jrecord/jrecord/src/net/net/sf/sf/jrecord/common/common/conversion一下

并设置一个包装的小数,请参阅setfield http://record-editor.svn.sourceforge.net/viewvc/record-editor/source/jrecord/jrecord/src/net/net/net/net/sf/jrecord/sfepes/typepepackeddecimal.java?revisimal.java?revision=3&view=markup

这两个例程都采用字节数阵列,一个开始位置和一个场位置的长度。

在网络上进行此操作的其他示例(我认为Jranch也有进行转换的代码),请进行一些谷歌搜索。

其他提示

将分区小数转换为Comp-3非常容易 - 翻转低字节的小点心,并剥离所有其他字节的高鼻子。

考虑数字12345-在包装的小数符号中,那将是X'12345C'或X'12345F'(C和F均为 +,AB和D是 - )。当您将其转换为划分小数点时,您将低鼻涕翻转,并在每个数字之间的高刺中插入“ F”。将其变成X'F1F2F3F4C5'。

要将其转换,您只需扭转过程即可。使用Java,看起来像:

byte[] myDecimal = { 0xF1, 0xF2, 0xF3, 0xF4, 0xF5 };
byte[] myPacked = new byte[3];

//Even low nibble moved to high nibble and merged with odd low nibble
myPacked[0] = ((myDecimal[0] & 0b00001111)  << 4)) | (myDecimal[1] & 0b00001111);
myPacked[1] = ((myDecimal[2] & 0b00001111)  << 4)) | (myDecimal[3] & 0b00001111);

//Last byte gets filpped for sign
myPacked[2] = ((myDecimal[5] & 0b00001111)  << 4)) | (myDecimal[4] & 0b00001111);

过去,当我用Java与Comp-3混在一起时,我最终写了一种在字节中读取并将其转换为数字的方法。我认为我曾经不得不写入Comp-3,但我认为我会反向使用相同的逻辑。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top