使用21个字符转换hexa中的字符串

时间:2013-08-08 11:56:11

标签: c# java c++ bit-manipulation shift

我有一个与另一个应用程序集成的服务,它只接受21个hexa字符。我需要传递并接收带有11个十进制字符的字符串,样本为:String s = "0101230154V";

我想知道,我如何使用移位操作将其转换为位并传输,因为我无法将我的十进制字符串转换为hexa,因为它将导致22个hexa字符。我试过下面的代码。我认为六进制转换是可以的,但是当我尝试转换回十进制表示法时它不起作用,给我其他值。程序员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。我可以读得很好但我不知道如何转换回六进制值并取nk值作为样本:

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);

谢谢

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

如果这是一个真正的错字。 11个十进制字符的最大值为99,999,999,999,适合64位int。所以你可以将字符串转换为int64(只需要16个六进制字符),必要时填充0字节,然后传递给另一个服务。

如果它不是拼写错误。然后你仍然可以将前10个十进制数字转换为int64,然后传递int64和剩余的char,只需要18个hexa字符

另一种解决方案,如果您不想转换为二进制文件,densely packed decimal (DPD)是一个不错的选择。它将3位十进制数字打包成10位。因此10位需要34位,占用9位六位数。这直接在十进制上工作,不需要转换为二进制,因此它不仅占用更少的空间,而且来回转换也非常快。如果您不需要对值进行算术运算,这可能是最佳选择

答案 2 :(得分:1)

你能确保角色不会出现在前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