2

我有一项与另一个应用程序集成的服务,它只接受 21 个十六进制字符。我需要传递并接收一个包含 11 个十进制字符的字符串,例如:String s = "0101230154V";

我想知道,如何使用移位操作将其转换为位并传输,因为我无法将十进制字符串转换为十六进制,因为它会产生 22 个十六进制字符。我试过下面的代码。我认为可以进行六进制转换,但是当我尝试转换回十进制表示法时它不起作用,请给我其他值。我认为程序员 C#、C++ 和 Java 可以帮助我。

int n = 99;  // 2^6 bits to use 99
int k = 999; // 2^9 bits to use 999

int bits = (n << 6) | (k << 9 << 6); // I'm not sure if it is ok to convert and use with hexa

var hexa = bits.ToString("X"); // I will transmit this hexa to a web service

在另一个项目中,我有一个 Windows 服务来从 Web 服务中读取 hexa。我可以读得很好,但我不知道如何转换回 hexa 值并取nandk值,例如:

string hexa = GetFromWebService(); // get from the value from the web service here, its fine

// I will recieve the hexa and get the number in bits
int received = Int32.Parse(hexa, System.Globalization.NumberStyles.HexNumber);

// here I need to discover the N and K values... how?

如何发现nk价值?

最终解决方案

long v = 123456789456;
string h = v.ToString("X");

// trasmit h value

var data = long.Parse(hexaValueFromService, System.Globalization.NumberStyles.HexNumber);

谢谢你

4

3 回答 3

1

我不知道当您说“11 个十进制字符”时是否有错字,因为最后一个字符显然不是十进制或十六进制数字。

如果它是一个真正的错字,11 个十进制字符的最大值为 99 999 999 999,它适合 64 位 int,仅对应于 16 个十六进制字符。因此,您可以将字符串转换为int64_t(C++)/ long(C#/Java),然后传递给其他服务。

如果不是拼写错误,您仍然可以将前 10 个十进制数字转换为 a int64_t,然后同时传递 theint64_t和剩余的字符,只需要 18 个十六进制字符

如果您不想转换为二进制,那么密集十进制 (DPD)是一个不错的选择。它将 3 个十进制数字打包成 10 位。所以 10 位需要 34 位,占用 9 个十六进制数字。这直接适用于十进制,不需要转换为二进制,因此不仅占用更少的空间,而且来回转换也非常快。如果您不需要对值进行算术运算,这可能是最佳选择

于 2013-08-08T13:43:32.677 回答
1

一个 ASCII 字符占用一个字节或 8 位。一个 Unicode 字符占用两个字节,即 16 位。因此,11 个字符的字符串将占用 11 个字节或 22 个字节,具体取决于 CharacterSet。尝试将 CharacterSet 设置为 ASCII,它会起作用。
在正常打字中,两个十六进制字符存储一个字节。因此,您的服务最多有 90 位输入(10.5 字节)

于 2013-08-08T12:01:22.147 回答
1

你能保证字符不会出现在前2位吗?如果是这样,那么您可以将前 2 位的整数放入 k 中。

如果您在通过时左移以抑制前导 '0',则一旦获得它,您将再次右移以获取原始数字,而不是解析整数。例如:如果你这样做:

(n 是 6 位,k 是 9 位)所以,你想将它们组合成位(15 位,第 16 位是符号位,所以不会使用它)

int bits =   (k << 6) | n

当您收到时,您必须这样做才能检索值:

n = (bits & 0x3F)     // gets rid of k in the first part 0x3F means '0000000000111111'
k = (bits >> 6)       // gets rid of n at the bottom part
于 2013-08-08T14:23:21.570 回答